加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Redis的基础知识和使用场景

发布时间:2021-11-07 00:18:39 所属栏目:语言 来源:互联网
导读:什么是redis? Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。Redis 以其超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。国内外很多大
什么是redis?
Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。Redis 以其超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。国内外很多大型互联网公司都在使用 Redis,比如 Twitter、YouPorn、暴雪娱乐、Github、StackOverflow、腾讯、阿里、京东、华为、新浪微博等等,很多中小型公司也都有应用。也可以说,对 Redis 的了解和应用实践已成为当下中高级后端开发者绕不开的必备技能。
 
Redis 可以做什么
记录帖子的点赞数、评论数和点击数 (hash)。
记录用户的帖子 ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。
记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。
记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。
缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。
记录帖子的相关文章 ID,根据内容推荐相关帖子 (list)。
如果帖子 ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器)。
收藏集和帖子之间的关系 (zset)。
记录热榜帖子 ID 列表,总热榜和分类热榜 (zset)。
缓存用户行为历史,进行恶意行为过滤 (zset,hash)。
.........等等
redis 基础数据结构及相关应用介绍
关于基础数据结构也可以看我之前的文章《换一种存储方式,居然能节约这么多内存?》。
 
string
实现方式:
 
动态字符串;内部结构类似java 的ArrayList;采用与预分配冗余空间的方式来减少内存的频繁分配。 当字符长度<1M,扩容时加倍现有空间 当字符串>1M,扩容每次加1M,字符串最大长度为512M 字符串由多个字节组成,每个字节又由8个bit组成,一个字符串看做bit 组合,这便是bitmap(位图)数据结构。
 
命令
set key;get key
list
实现方式:
 
链表实现类似java 里面的LinkList。
 
在数据量少的情况下,使用的是快速列表,数据较少的情况下是用一块连续的内存,ziplist 数据结构。
 
数据多的时候使用linkedlist,链表结合ziplist,这样的优点:既满足了快速的插入删除的性能,又不会出现太大的空间冗余。
 
经典应用:
 
异步队列 需要注意的是 lindex 是慢操作时间复杂度O(n),慎用。
 
队列空了可能造成 cpu空转,qps也可能被拉高。可以采用阻塞读:blpop/brpop
 
命令
rpush rpop
hash
类似java 里面的HashMap,数组+链表的二维结构。在数据量少的时候是ziplist。
 
和HashMap对比:redis key只能是字符串,而且rehash 方式不同。
 
set
类似java HashSet。
 
应用场景:
 
保存中奖用户的id,有去重功能
 
命令
sadd
smembers key 获取所有的key
sismember key setv 相当于contains(s)
scard key 返回key 的数量
spop keys:Redis Spop 命令用于移除集合中的指定 key 的一个或多个随机元素。
zset
类似java SortedSet 和HashMap 结合体;concurrentskipmap
 
内部实现 “跳跃链表”的数据结构。数据少的时候使用ziplist。数据多的时候用skiplist.
 
注意:关于过期时间,以对象为单位,如果设置了过期时间,然后调用set 修改了对象,过期时间会消失。
 
经典应用
粉丝列表:value ID, score 关注时间
分布式锁:
redis2.8 加入了set指令的扩展参数,使得 setnx 和 expire 指令可以一起执行 。
 
jredis 命令:
 
StringUtils.equals("OK", redis.set("seemoonup", "false", "NX", "EX", 5))  
这个命令的完整意思就是 如果“seemoonup“这个key不存在设置为”false“并且设置过期时间5秒,该实现缺点:没有ack(消息确认机制) 保证。
 
位图
最小单位bit(比特)只能是0,1
 
bitfield
有三个子指令,分别是 get/set/incrby,它们都可以对指定位片段进行读写,但是最多只能处理 64 个连续的位,如果 超过 64 位,就得使用多个子指令,bitfield 可以一次执行多个子指令
 
bitmap
setbit
bitcount
redis 高级一些的应用
HyperLogLog
这是一种高级数据结构,提供不准确的去重计数方案,误差率在0.81%。
 
应用场景
 
高访问量页面的UV, 不适合单用户的存储。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读