redis是一个开源的(BSD许可的)内存数据结构存储,用作数据库、缓存和消息代理。它支持字符串、散列、列表、集合、带范围查询的排序集、位图、超日志、具有RADIUS查询和流的地理空间索引等数据结构。Redis内置了复制、Lua脚本、LRU驱逐、事务处理和不同级别的磁盘上持久化,并通过Redis Sentinel和Redis集群自动分区提供了高可用性。
127.0.0.1:6379[3]> keys *
1) "age"
2) "name"
127.0.0.1:6379[3]> exists name #判断当前key是否存在,存在返回1,不存在返回0
(integer) 1
127.0.0.1:6379[3]> exists name1
(integer) 0
127.0.0.1:6379[3]> move name 1 #移除key
(integer) 1
127.0.0.1:6379[3]> keys *
1) "age"
127.0.0.1:6379[3]> set name yang
OK
127.0.0.1:6379[3]> expire name 10 #为key设置过期时间,单位是秒
(integer) 1
127.0.0.1:6379[3]> ttl name #查看key的剩余时间
(integer) 6
127.0.0.1:6379[3]> ttl name
(integer) 1
127.0.0.1:6379[3]> get name
(nil)
127.0.0.1:6379[3]> type name #查看key的类型
none
127.0.0.1:6379[3]> type age
string
127.0.0.1:6379[3]>
127.0.0.1:6379> set name aa
OK
127.0.0.1:6379> append name bb #追加字符串,如key不存在,则相当于set name
(integer) 4
127.0.0.1:6379> get name
"aabb"
127.0.0.1:6379> strlen name #查看字符串长度
(integer) 4
#########################################################################################
127.0.0.1:6379> set views 0 #初始值0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views #自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views #自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incrby views 10 #设置指定增量
(integer) 10
127.0.0.1:6379> incrby views 10
(integer) 20
127.0.0.1:6379> decrby views 5 #设置指定减量
(integer) 15
127.0.0.1:6379> get views
"15"
#########################################################################################
127.0.0.1:6379> set key hello,string
OK
127.0.0.1:6379> get key
"hello,string"
127.0.0.1:6379> getrange key 0 3 #截取字符串0,3
"hell"
127.0.0.1:6379> getrange key 0 -1 #获得全部字符串
"hello,string"
127.0.0.1:6379> setrange key 2 p #替换指定位置字符串
(integer) 12
127.0.0.1:6379> get key
"heplo,string"
#########################################################################################
# setex (set with expire) # 设置过期时间
# setnx (set if not exist) # 不存在在设置 (在分布式锁中会常常使用!)
127.0.0.1:6379> setex key2 20 hello #设置过期时间
OK
127.0.0.1:6379> get key2
"hello"
127.0.0.1:6379> ttl key2
(integer) -2
127.0.0.1:6379> setnx key3 hello2 #不存在才设置
(integer) 1
127.0.0.1:6379> setnx key3 MongoDB # 如果key3存在,创建失败!
(integer) 0
127.0.0.1:6379> get key3
"hello2"
127.0.0.1:6379> keys *
1) "myhash:{tag}:__rand_int__"
2) "mylist:{tag}"
3) "key3"
4) "name"
5) "key"
6) "key:{tag}:__rand_int__"
7) "counter:{tag}:__rand_int__"
8) "views"
#########################################################################################
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset k1 a k2 b k3 c #设置多值
OK
127.0.0.1:6379> mget k1 k2 k3 #获取多值
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> msetnx k1 w k4 d # msetnx 是一个原子性的操作,要么一起成功,要么一起失败!
(integer) 0
127.0.0.1:6379> get k4
(nil)
?
# 对象
set user:1 {name:zhangsan,age:3} # 设置一个user:1 对象 值为 json字符来保存一个对象!
# 这里的key是一个巧妙的设计: user:{id}:{filed} , 如此设计在Redis中是完全OK了!
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
#########################################################################################
getset # 先get然后在set
127.0.0.1:6379> getset db redis # 如果不存在值,则返回
nil (nil)
127.0.0.1:6379> get db
"redis
127.0.0.1:6379> getset db mongodb # 如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
?
数据结构是相同的! String类似的使用场景:value除了是我们的字符串还可以是我们的数字! 计数器
统计多单位的数量
粉丝数
对象缓存存储
栈,队列,阻塞队列
所有list命令都已l开头,头进屁股出
127.0.0.1:6379> lpush list one #将一个或者多个值插入列表头部
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #取出list中所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 #通过区间获取具体值
1) "three"
2) "two"
127.0.0.1:6379> rpush list four #把值插入屁股
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
#########################################################################################
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list #移除头部的值
"three"
127.0.0.1:6379> rpop list #移除尾部的值
"four"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
#########################################################################################
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1 #通过下标获取list中某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
#########################################################################################
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> llen list #返回列表长度
(integer) 2
#########################################################################################
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "two"
3) "one"
127.0.0.1:6379> lrem list 2 two #移除指定的值,2是数量,移除两个two
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "one"
#########################################################################################
127.0.0.1:6379> lpush mylist aa
(integer) 1
127.0.0.1:6379> lpush mylist bb
(integer) 2
127.0.0.1:6379> lpush mylist cc
(integer) 3
127.0.0.1:6379> lpush mylist dd
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "dd"
2) "cc"
3) "bb"
4) "aa"
127.0.0.1:6379> ltrim mylist 1 2 #修剪,截取指定字符串,其他元素删除
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "cc"
2) "bb"
#########################################################################################
rpoplpush # 移除列表的后一个元素,将他移动到新的列表中!
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist # 移除列表的后一个元素,将他移动到新的 列表中! "hello2"
127.0.0.1:6379> lrange mylist 0 -1 # 查看原来的列表
1) "hello"
2) "hello1"