redis核心数据结构

本文详细介绍了Redis中的核心数据结构,包括string、hash、list、set和zset,并展示了它们在缓存、分布式锁、计数器、session共享等场景的应用。还探讨了各自的操作方法和优缺点,如string的GET、SET、MSET,hash的HMSET、HGET,list的LPUSH、LRANGE,set的SADD、SMEMBERS,以及zset的ZADD、ZREVRANGE等。
摘要由CSDN通过智能技术生成
  • string 字符串

        1.单值缓存

        SET  key  value

        GET  key 

        2.对象缓存

                1)最常见的就是将对象转成json存入

                SET  user:1(userId)  value(json格式数据)

                2) 将对象的属性分开来存储,对于一个对象有几十个属性,但只有一两个属性经常修改,就比较适合这种方式

                mset user:1:name yang user:1:balance 666

                mget user:1:name user:1:balance

       

        3.分布式锁

                SETNX  product:10001  true 

                SETNX  product:10001  true     //当多个线程对同一产品操作时,返回1代表获取锁成功,返回0代表获取锁失败

                。。。。                                    //业务操作

                DEL  product:10001                  // 执行完业务释放锁

    

        4.计数器

                比如说文章阅读次数。没点击一次执行一次原子加一,通过key可以轻松得到文章阅读次数。

                INCR article:readcount:{文章id}

                GET article:readcount:{文章id}

        5.Web集群Session共享

                spring session + redis实现session共享

        6.分布式系统全局序列号

                INCRBY  orderId  1000   //通过原子操作来生成主键id

                可以直接取1000出来,在本地内存中加减,这样可以大大减轻redis的压力。

        7.常用操作说明

                SET  key  value             //存入字符串键值对

                MSET  key  value [key value ...]     //批量存储字符串键值对

                SETNX  key  value         //存入一个不存在的字符串键值对

                GET  key             //获取一个字符串键值

                MGET  key  [key ...]         //批量获取字符串键值

                DEL  key  [key ...]         //删除一个键

                EXPIRE  key  seconds         //设置一个键的过期时间(秒)

                原子操作

                INCR  key             //将key中储存的数字值加1

                DECR  key             //将key中储存的数字值减1

                INCRBY  key  increment         //将key所储存的值加上increment

                DECRBY  key  decrement     //将key所储存的值减去decrement

  • hash 哈希

        1.对象缓存

                HMSET user 1:name yang 1:balance 666

                hmget user 1:name 1:balance

        

        2.电商购物车

                1)以用户id为key

                2)商品id为field

                3)商品数量为value

                购物车操作:

                添加商品->hset cart:1001 10086 1

        

                增加数量->hincrby cart:1001 10086 2

         

                商品总数->hlen cart:1001

        

                删除商品->hdel cart:1001 10088

                获取购物车所有商品->hgetall cart:1001

        

        3.优缺点

                优点

                1)同类数据归类整合储存,方便数据管理

                2)相比string操作消耗内存与cpu更小

                3)相比string储存更节省空间

                缺点

                1)过期功能不能使用在field上,只能用在key上

                2)Redis集群架构下不适合大规模使用

        4.hash常用操作

                HSET  key  field  value             //存储一个哈希表key的键值

                HSETNX  key  field  value         //存储一个不存在的哈希表key的键值

                HMSET  key  field  value [field value ...]     //在一个哈希表key中存储多个键值对

                HGET  key  field                 //获取哈希表key对应的field键值

                HMGET  key  field  [field ...]         //批量获取哈希表key中多个field键值

                HDEL  key  field  [field ...]         //删除哈希表key中的field键值

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

                HGETALL  key                //返回哈希表key中所有的键值

                HINCRBY  key  field  increment         //为哈希表key中field键的值加上增量increment

  • list 列表

        1.常用数据结构

                Stack(栈,FILO) = LPUSH + LPOP

                

                Queue(队列)= LPUSH + RPOP

                Blocking MQ(阻塞队列)= LPUSH + BRPOP

        2.微博和微信的工号信息流

                假如我微信上关注了本地生活,本地健身公众号,本地生活发消息

                1)本地生活发消息,消息ID为10010

                        LPUSH  msg:{我-ID}  10010

                2)本地健身发消息,消息ID为10086

                        LPUSH  msg:{我-ID} 10086

                3)我查看最新的消息

                        LRANGE  msg:{我-ID}  0  4

                

                这样就按照时间顺序列出消息id

        3.list常用操作

                LPUSH  key  value [value ...]         //将一个或多个值value插入到key列表的表头(最左边)

                RPUSH  key  value [value ...]         //将一个或多个值value插入到key列表的表尾(最右边)

                LPOP  key            //移除并返回key列表的头元素

                RPOP  key            //移除并返回key列表的尾元素

                LRANGE  key  start  stop        //返回列表key中指定区间内的元素,区间以偏移量start和stop指定

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

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

  • set 集合

        1.微信抽奖小程序

                1)点击参与抽奖加入集合

                SADD key {userlD}

                2)查看参与抽奖所有用户

                SMEMBERS key

                3)抽取count名中奖者

                SRANDMEMBER key [count] / SPOP key [count]

                

        2.微信、微博点赞、收藏、标签

                1) 点赞

                SADD  like:{消息ID}  {用户ID}

                2) 取消点赞

                SREM like:{消息ID}  {用户ID}

                3) 检查用户是否点过赞

                SISMEMBER  like:{消息ID}  {用户ID}

                4) 获取点赞的用户列表

                SMEMBERS like:{消息ID}

                5) 获取点赞用户数

                SCARD like:{消息ID}

        3.集合操作实现微博、微信的关注模型

                1) 诸葛关注的人: 

                zhugeSet-> {guojia, xushu}

                2) 杨过关注的人:

                yangguoSet--> {zhuge, baiqi, guojia, xushu}

                3) 郭嘉老师关注的人: 

                guojiaSet-> {zhuge, yangguo, baiqi, xushu, xunyu)

                4) 诸葛和杨过共同关注:

                SINTER zhugeSet yangguoSet--> {guojia, xushu}

                5) 诸葛关注的人也关注他(杨过老师):

                SISMEMBER guojiaSet yangguo

                SISMEMBER xushuSet yangguo

                6) 诸葛可能认识的人:

                SDIFF yangguoSet zhugeSet->(zhuge, baiqi}

        4.set常用操作

        SADD  key  member  [member ...]            //往集合key中存入元素,元素存在则忽略,若key不存在则新建

        SREM  key  member  [member ...]            //从集合key中删除元素

        SMEMBERS  key                    //获取集合key中所有元素

        SCARD  key                    //获取集合key的元素个数

        SISMEMBER  key  member            //判断member元素是否存在于集合key中

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

        SPOP  key  [count]                //从集合key中选出count个元素,元素从key中删除

        运算操作

        SINTER  key  [key ...]                 //交集运算

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

        SUNION  key  [key ..]                 //并集运算

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

        SDIFF  key  [key ...]                 //差集运算

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

  • zset 有序集合

        1.zset集合操作实现排行榜

        ZINCRBY  hotNews:20190819  1  守护香港

        2)展示当日排行前十

        ZREVRANGE  hotNews:20190819  0  9  WITHSCORES

        3)七日搜索榜单计算

        ZUNIONSTORE  hotNews:20190813-20190819  7 hotNews:20190813  hotNews:20190814... hotNews:20190819

        4)展示七日排行前十

        ZREVRANGE hotNews:20190813-20190819  0  9  WITHSCORES

       

        2.zset常用操作

                ZADD key score member [[score member]…]    //往有序集合key中加入带分值元素

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

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

                ZINCRBY key increment member        //为有序集合key中元素member的分值加上increment 

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

                ZRANGE key start stop [WITHSCORES]    //正序获取有序集合key从start下标到stop下标的元素

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

                集合操作

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

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

  • 其他高阶命令

        keys:全量遍历键, 用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时,性能比较差,要避免使用。

        

        

        scan:渐进式遍历键 。

        SCAN cursor [MATCH pattern] [COUNT count]

                scan 参数提供了三个参数,第一个是 cursor 整数值(hash桶的索引值),第二个是 key 的正则模式,第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。第一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历到返回的 cursor 值为 0 时结束。

         

        注意:但是scan并非完美无瑕, 如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,如果导致rehash,整个结构都会发生变化,那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说scan并不能保证完整的遍历出来所有的键, 这些是我们在开发时需要考虑的。

 

 

 

 

 

 

                

 

                 

 

                

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值