**
P13:String类型使用
**
127.0.0.1:6379> set key1 xs #设置值
OK
127.0.0.1:6379> get key1 #获取值
“xs”
127.0.0.1:6379> EXISTS key1 #判断是否存在
(integer) 1
127.0.0.1:6379> append key1 “fd” #追加字符串,如果key不存在就相当于新增
(integer) 4
127.0.0.1:6379> get key1
“xsfd”
#自增:
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> incrby views 10 #设置自增步长(自减同理)
(integer) 8
127.0.0.1:6379> incrby views 10
(integer) 18
#字符串范围 range
127.0.0.1:6379> set key2 “hello,xs”
OK
127.0.0.1:6379> get key2
“hello,xs”
127.0.0.1:6379> GETRANGE key2 0 2 #截取字符串 0-2
“hel”
127.0.0.1:6379> GETRANGE key2 0 -1 #截取所有字符串(=get key)
“hello,xs”
#替换
127.0.0.1:6379> set key3 xsfd
OK
127.0.0.1:6379> SETRANGE key3 2 xs #替换从指定位置开始的字符串
(integer) 4
127.0.0.1:6379> get key3
“xsxs”
#设置过期时间
setex (set with expire) #设置过期时间
setnx (set if not exist) #不存在在设置(只能设置不存在的,在分布式中经常使用)
127.0.0.1:6379> setex key4 30 xs #设置key4 30秒过期
OK
127.0.0.1:6379> ttl key4 #还有25秒过期
(integer) 25
127.0.0.1:6379> ttl key4 #还有19秒过期
(integer) 19
127.0.0.1:6379> setnx key5 xusheng #如果key5不存在则创建
(integer) 1
127.0.0.1:6379> setnx key5 fengding #如果key5存在则失败
(integer) 0
127.0.0.1:6379> get key5
“xusheng”
#批量mset,mget
127.0.0.1:6379> mset key1 xs key2 fd key3 xy key4 pdh #设置多个值
OK
127.0.0.1:6379> keys *
- “key4”
- “key3”
- “key2”
- “key1”
127.0.0.1:6379> msetnx key2 nice key10 beef #msetnx 是一个原子性的操作,要么都成功要么都失败
(integer) 0
#对象
set user:1 {name:zhangsan,age:3} #设置一个user:1对象,值为json字符来保存一个对象
#这里的key是一个巧妙的设计: user:{id}:{field}作为key
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 21
OK
127.0.0.1:6379> mget user:1:name user:1:age
- “zhangsan”
- “21”
#getset 先get后set
127.0.0.1:6379> getset bd bd1 #如果不存在则返回nil,但是会set进去
(nil)
127.0.0.1:6379> get bd
“bd1”
127.0.0.1:6379> getset bd db2 #如果存在会获取原来的值,并把新的set进去
“bd1”
String使用场景:
1.计数器
2.统计多单位的数量
3.粉丝数 incr uid:16115:follow 关注就增加1
4.对象缓存存储
**
P14 List类型的
**
所有的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中值
- “three”
- “two”
- “one”
127.0.0.1:6379> LRANGE list 0 1 - “three”
- “two”
127.0.0.1:6379> RPUSH list right #将一个或者多个值插入到列表尾部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
- “three”
- “two”
- “one”
- “right”
#LPOP RPOP 左边移除和右边移除
#Lindex 获取list中某个下标的值
127.0.0.1:6379> LINDEX list 0
“three”
#Llen 获取list长度
127.0.0.1:6379> LLEN list
(integer) 4
#Lrem 移除指定值
127.0.0.1:6379> LRANGE list 0 -1
- “one”
- “one”
- “three”
- “two”
- “one”
- “right”
127.0.0.1:6379> LREM list 1 one #移除1个list中值为one的值
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1 - “one”
- “three”
- “two”
- “one”
- “right”
127.0.0.1:6379> LREM list 2 one #移除2个list中值为one的值
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1 - “three”
- “two”
- “right”
#Ltrim 通过下标截取指定长度
127.0.0.1:6379> LRANGE mylist 0 -1
- “hello”
- “hello1”
- “hello2”
- “hello3”
127.0.0.1:6379> LTRIM mylist 0 1
OK
127.0.0.1:6379> LRANGE mylist 0 -1 - “hello”
- “hello1”
#rpoplpush #移除列表最后一个元素并放入新的列表
127.0.0.1:6379> LRANGE mylist 0 -1
- “hello”
- “hello1”
- “hello2”
127.0.0.1:6379> rpoplpush mylist newlist
“hello2”
127.0.0.1:6379> LRANGE newlist 0 -1 - “hello2”
127.0.0.1:6379> LRANGE mylist 0 -1 - “hello”
- “hello1”
#lset 将列表中指定下标的值替换为另一个值,更新操作
127.0.0.1:6379> LRANGE list 0 -1
- “xusheng”
127.0.0.1:6379> lset list 0 fengding #0下标替换为fengding
OK
127.0.0.1:6379> LRANGE list 0 -1 - “fengding”
127.0.0.1:6379> lset list 1 xusheng #如果这个下标不存在就会报错
(error) ERR index out of range
#linsert 将某个具体的value插入到列表中某个元素的前面/后面
127.0.0.1:6379> LRANGE list 0 -1
- “xusheng”
- “fengding”
127.0.0.1:6379> LINSERT list before fengding xihuan
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 - “xusheng”
- “xihuan”
- “fengding”
127.0.0.1:6379> LINSERT list after fengding chibaba
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 - “xusheng”
- “xihuan”
- “fengding”
- “chibaba”
小结:
1.实际上是一个链表,before Node after, left right 都可以插入值
2.如果key不存在,创建新的链表
3.如果key存在,新增内容
4.如果移除了所有值,空链表,也代表不存在
5.在两边插入或者改动值,效率最高,在中间的元素效率会低一点。
作用:消息排队,消息队列(Lpush, Rpop),栈(Lpush,Lpop)
**
P15 Set
**
set中的值是不能重复的。
127.0.0.1:6379> sadd myset xusehng #插入值
(integer) 1
127.0.0.1:6379> sadd myset fengding #插入值
(integer) 1
127.0.0.1:6379> sadd myset hahaha #插入值
(integer) 1
127.0.0.1:6379> sadd myset xixi #插入值
(integer) 1
127.0.0.1:6379> SMEMBERS myset #查看set中所有元素
- “xusehng”
- “xixi”
- “hahaha”
- “fengding”
127.0.0.1:6379> SISMEMBER myset xusheng #判断set中是否有xusheng元素
(integer) 0
127.0.0.1:6379> SISMEMBER myset dog
(integer) 0
127.0.0.1:6379> SISMEMBER myset xixi
(integer) 1
127.0.0.1:6379> scard myset #获取set集合中元素个数
(integer) 4
127.0.0.1:6379> SREM myset xusehng #移除set中指定元素
(integer) 1
127.0.0.1:6379> SRANDMEMBER myset 1 #随机抽取set中指定个数的元素 - “xixi”
127.0.0.1:6379> SRANDMEMBER myset 1 - “fengding”
127.0.0.1:6379> spop myset 1 #随机删除set集合中指定个数的元素 - “xixi”
127.0.0.1:6379> SMOVE myset myset2 fengding #set中指定元素移动到另一个set中
(integer) 1
127.0.0.1:6379> SMEMBERS myset2 - “fengding”
微博。b站共同关注
数字集合类:
差集
交集
并集
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> SDIFF key1 key2 #差集
- “a”
- “b”
127.0.0.1:6379> SINTER key1 key2 #交集 共同好友就可以这样实现 - “c”
127.0.0.1:6379> SUNION key1 key2 #并集 - “c”
- “b”
- “d”
- “e”
- “a”
**
P16 Hash
**
Map集合,key-map,这时候值是一个map集合,就相当于Sting里的值变为了一个key-value
127.0.0.1:6379> hset myhash field1 xusheng
(integer) 1
127.0.0.1:6379> hget myhash field1
“xusheng”
127.0.0.1:6379> hmset myhash field1 xusheng field2 fengding
127.0.0.1:6379> hmget myhash field1 field2
- “xusheng”
- “fengding”
127.0.0.1:6379> hgetall myhash - “field1”
- “xusheng”
- “field2”
- “fengding”
127.0.0.1:6379> HDEL myhash field1 #删除指定的key,对应的value也没了
(integer) 1
127.0.0.1:6379> hgetall myhash
- “field2”
- “fengding”
hlen:获取长度
127.0.0.1:6379> HLEN myhash
(integer) 1
127.0.0.1:6379> hset myhash name xusheng
(integer) 1
127.0.0.1:6379> HLEN myhash
(integer) 2
hexists:判断key是否存在
127.0.0.1:6379> HEXISTS myhash key
(integer) 0
127.0.0.1:6379> HEXISTS myhash name
(integer) 1
127.0.0.1:6379>
获取所有的key
获取所有的value
127.0.0.1:6379> hkeys myhash 获取key
- “field2”
- “name”
127.0.0.1:6379> HVALS myhash 获取values - “fengding”
- “xusheng”
incr
decr
127.0.0.1:6379> HINCRBY myhash count 3 #指定增量3
(integer) 4
127.0.0.1:6379> HINCRBY myhash count 3
(integer) 7
127.0.0.1:6379> hsetnx myhash test xuxu #非空创建成功
(integer) 1
127.0.0.1:6379> hsetnx myhash test xuxu #非空创建失败
(integer) 0
hash应用:
变更的数据,user:1作为key,里面存放name,age。。 适合对象的存储,而string适合字符串的存储