Redis常用5种数据结构及操作

58 阅读6分钟

介绍

redis是一个高性能的key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。

字符串String

常用操作

增/改

SET  key  value 			//存入字符串键值对
set user:name '亚索'    

MSET  key  value [key value ...] 	//批量存储字符串键值对
mset user:name '亚索' user:age 12

SETNX  key  value 		//存入一个不存在的字符串键值对
sexnx user:name '亚索'

DEL  key  [key ...] 		//删除一个键
del user:name

GET  key 			//获取一个字符串键值
get user:name

MGET  key  [key ...]	 	//批量获取字符串键值
mget user:name user:age

过期时间

EXPIRE  key  seconds 		//设置一个键的过期时间(秒)
expire user:name 10             //10s 后过期

原子加减

INCR  key 			//将key中储存的数字值加1
INCR user:age                   //返回13

DECR  key 			//将key中储存的数字值减1
DECR user:age                   //返回12

INCRBY  key  increment 		//将key所储存的值加上increment
INCRBY user:age 10              // +10,返回22

DECRBY  key  decrement 	        //将key所储存的值减去decrement
DECRBY user:age 10              // -10, 返回12

应用场景

  • 单值缓存
  • 对象缓存(存json,或者存多个key)
  • 分布式锁(setnx key value ex time;返回1,表示设置成功;设置超时时间,防止程序意外终止,导致死锁)
  • 计数器(incr)
  • web集群session共享
  • 分布式系统全局ID号(INCRBY id 1000; 批量生成序列号提升性能)

哈希Hash

常用操作

增/改

HSET  key  field  value 			//存储一个哈希表key的键值
hset hero:1 name '亚索'                         //成功,返回1
hset hero:1 age 12

HSETNX  key  field  value 		//存储一个不存在的哈希表key的键值
hsetnx hero:1 name '亚索'               //field存在,返回0
hsetnx hero:1 name2 '盖伦'              //成功,返回1

HMSET  key  field  value [field value ...] 	//在一个哈希表key中存储多个键值对
hmset hero:1 skill1 '死亡如风' skill2 '常伴吾身' skill3  '风墙'

image.png

HGET  key  field 				//获取哈希表key对应的field键值
hget hero:1 name

HMGET  key  field  [field ...] 		//批量获取哈希表key中多个field键值
hmget hero:1 name age skill1

HLEN  key				//返回哈希表key中field的数量
HLEN hero:1                             

HGETALL  key				//返回哈希表key中所有的键值
HGETALL hero:1                          //返回所有filed和value

HDEL  key  field  [field ...] 		//删除哈希表key中的field键值
HDEL hero:1 skill2                      //成功删除,返回1

原子加减

HINCRBY  key  field  increment 		//为哈希表key中field键的值加上增量increment
HINCRBY hero:1 age 5                    //增加5,返回17

应用场景

  • 对象缓存(比string节省空间,消耗内存和cpu更小)
  • 购物车(用户id为key,商品id为field,商品数量value)

缺点:过期功能只能用在key上,不能用在field上;Redis集群架构下不适合大规模使用

列表List

常用操作

增/改

LPUSH  key  value [value ...] 		//将一个或多个值value插入到key列表的表头(最左边)
lpush list 111
lpush list 222                          //list=[222, 111]
RPUSH  key  value [value ...]	 	//将一个或多个值value插入到key列表的表尾(最右边)
rpush list 333                         //list=[222, 111, 333]

LPOP  key			//移除并返回key列表的头元素
lpop list                       //返回222
RPOP  key			//移除并返回key列表的尾元素
rpop list                       //返回333

BLPOP  key  [key ...]  timeout	//从key列表表头弹出一个元素,若列表中没有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout 	//从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待

image.png

LRANGE  key  start  stop	//返回列表key中指定区间内的元素,区间以偏移量start和stop指定
lrange list 1 3                 //list = [1,2,3,4] ,返回 234

LLEN key                       //返回列表元素个数

常用数据结构

Stack(栈) = LPUSH + LPOP Queue(队列)= LPUSH + RPOP Blocking MQ(阻塞队列)= LPUSH + BRPOP

应用场景

  • 消息按顺序排列(lpush)
  • 获取最新的指定数量的消息(lrange)

集合Set

常用操作

增/改

Set常用操作
SADD  key  member  [member ...]			//往集合key中存入元素,元素存在则忽略,若key不存在则新建
sadd my_set hello                               //成功,返回1
sadd my_set world

SMEMBERS  key					//获取集合key中所有元素
SMEMBERS my_set                                 //返回 hello, world

SCARD  key					//获取集合key的元素个数
SCARD my_set                                    //返回2

SISMEMBER  key  member			        //判断member元素是否存在于集合key中
SISMEMBER my_set hello                          //在集合内,返回1,否-返回0

SRANDMEMBER  key  [count]			//从集合key中选出count个元素,元素不从key中删除
SRANDMEMBER my_set 2

SPOP  key  [count] 				//从集合key中选出count个元素,元素从key中删除, 3.2.0之后才支持count参数
SPOP my_set 2

SREM  key  member  [member ...]			//从集合key中删除元素
srem my_set one two                            //返回删除的元素个数,2

运算

SINTER  key  [key ...] 				//交集运算
SINTERSTORE  destination  key  [key ..]		//将交集结果存入新集合destination中

SUNION  key  [key ..] 				//并集运算
SUNIONSTORE  destination  key  [key ...]	//将并集结果存入新集合destination中

SDIFF  key  [key ...] 				//差集运算
SDIFFSTORE  destination  key  [key ...]		//将差集结果存入新集合destination中

应用场景

抽奖

  • 参与抽奖(sadd)
  • 查看参与抽奖的所有用户(smembers)
  • 抽奖count名(srandmember,spop key count)

关注模型,每个人维护要给关注集合

  • 共同关注,求交集(SINTER)
  • 我关注的人也关注他(SISMEMBER)
  • 我可能认识的人(SDIFF)

有序集合Zset

常用操作

增/改

ZADD key score member [[score member]…]	//往有序集合key中加入带分值元素
zadd my_zset 1 one
zadd my_zset 2 two

ZINCRBY key increment member		//为有序集合key中元素member的分值加上increment 
ZINCRBY my_zset 5 one                   //返回增加后的score,6

image.png

ZSCORE key member 			//返回有序集合key中元素member的分值
zscore my_zset one                      //返回6

ZCARD key				//返回有序集合key中元素个数
zcard my_zset                           //返回3

ZRANGE key start stop [WITHSCORES]	//正序获取有序集合key从start下标到stop下标的元素
zrange my_zset 1 3                      //按照分值排序,返回three,one

ZREVRANGE key start stop [WITHSCORES]	//倒序获取有序集合key从start下标到stop下标的元素,根据score倒序

ZREM key member [member …]		//从有序集合key中删除元素

运算

ZUNIONSTORE destkey numkeys key [key ...] 	//并集计算
ZINTERSTORE destkey numkeys key [key …]	//交集计算

应用场景

排行榜

  • 热榜(按照阅读量倒序,ZREVRANGE)
  • 七日热榜(先求并集,再倒序,ZUNIONSTORE)

高级命令

keys 全量遍历键 当redis数据量比较大时,会阻塞redis主线程,性能比较差,要避免使用

scan 渐进式遍历键

SCAN cursor [MATCH pattern] [COUNT count]
scan 0 match user* 1000

cursor    //hash桶的索引值
pattern  //key的正则匹配
count    //遍历key的数量

返回下一次遍历时的游标位置,直到返回游标为0时结束

如果在scan的过程中如果有键的变化(增加、 删除、 修改) , 那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说 scan并不能保证完整的遍历出来所有的键

总结

官方文档地址

redis.io/commands/

打开心爱的redis客户端爽一下吧