一、Redis介绍
Redis是用C语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。
二、为什么要用Redis做缓存?
简单来说,主要是为了提升用户体验以及让更多的用户可以使用。
1)高性能方面:
如果用户第一次读取数据的话,这个过程是比较慢的,因为需要从硬盘里读取。
但是如果不是第一次读取数据,读取高频数据的话,就可以吧数据放到缓存里去让用户访问。
好处:这样用户就可以直接操作内存,不需要从硬盘里读取数据,速度非常快。
不过,要保持数据库里的数据与缓存里的数据一致性。如果数据库里数据改变,需要改变缓存里的数据。
2)高并发方面:
一般像MySQL这样的数据库QPS大概在1w左右(4核8G),而redis缓存可以达到10W+,最高可以达到30W。(就单机 redis 的情况,redis 集群的话会更高)。
QPS(Query Per Second):服务器每秒可以执行的查询次数;
所以,直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。我们也就提高的系统整体的并发。
三、Redis常用数据结构
1)String型
string型数据结构是key-value型的。虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串表示,而是自己构建了一种 简单动态字符串。
常用命令 set,get,strlen,exists,dect,incr,setex等。
127.0.0.1:6379> set key value #设置 key-value 类型的值
OK
127.0.0.1:6379> get key # 根据 key 获得对应的 value
"value"
127.0.0.1:6379> exists key # 判断某个 key 是否存在
(integer) 1
127.0.0.1:6379> strlen key # 返回 key 所储存的字符串值的长度。
(integer) 5
127.0.0.1:6379> del key # 删除某个 key 对应的值
(integer) 1
127.0.0.1:6379> get key
(nil)

使用场景:
1、string类型数据一般用来存放:不需要持久化的数据或者频繁更新的数据,比如验证码,点赞数
2、通过反序列化工具,缓存java对象。比如将某个对象序列化为json,需要用的时候再取出来,反序列化。常见的使用方式有mybatis二级缓存,接口级别缓存等等。
3、使用incr和decr来做点赞数。
4、分布式全局id。
在一个大型的系统下,如果涉及到分库分表后,mysql 的自增id满足不了需要,如果用户量不大,可以每次从redis 这里通过自增获取id,但是如果用户量大,每次都拿肯定会给redis造成压力,可以一次取1000个,放本地缓存里,等用完了再去取。
2)hash类型
是一个key-value的键值对,和java里的hashMap相似,当数据量较小是采用的是ziphash(默认),当数据量较大时采用hashtable。
常用指令
hset hash name zhencong --设置值,
hget hash name -- 获取值
hmset hash name zhencong age 18 --批量设置
hmget hash name age --批量获取
hgetall hash 获取key的所有值
hkeys hash 获取hashmap中所有的key
hvals hash 获取hashmap中所有的value

使用场景:
1,可以用于存储系统中对象的数据。后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。
3)list
list即是java中的链表。链表是一种非常常见的数据结构,特点是易于数据元素的插入和删除并且且可以灵活调整链表长度,但是链表的随机访问困难。
redis的list为quickList(快速链表)即多个ziplist(压缩链表)组合起来的。但是 C 语言并没有实现链表,所以 Redis 实现了自己的链表数据结构。
常用指令:
rpush myList valu5e1 --向 list 的头部(右边)添加元素
rpush myList value2 value3 --向list的头部(最右边)添加多个元素
lpop myList # 将 list的尾部(最左边)元素取出
lpush myList2 value1 --尾插
使用场景
可以实现栈和队列,需要注意的是,push和pop的操作是原子性的,所以操作redis的时候,直接用就行了,不要把list读出来,通过java修改,再放回去,这样不能保证数据一致性。(先读先写或先读后写)
4)set(无序)
redis的set和Java中HashSet 相似,可以自动去重。当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择。
set的底层结构是一个value为null的哈希表,也就意味着他的时间复杂度为O(1),也就意味着即使数据再多,查找的时间也是一样的。
使用场景
可以用来计算多个数据源的交集或并集、
常用指令
127.0.0.1:6379> sadd mySet value1 value2 # 添加元素进去
(integer) 2
127.0.0.1:6379> sadd mySet value1 # 不允许有重复元素
(integer) 0
127.0.0.1:6379> smembers mySet # 查看 set 中所有的元素
1) "value1"
2) "value2"
127.0.0.1:6379> scard mySet # 查看 set 的长度
(integer) 2
127.0.0.1:6379> sismember mySet value1 # 检查某个元素是否存在set 中,只能接收单个元素
(integer) 1
127.0.0.1:6379> sadd mySet2 value2 value3
(integer) 2
127.0.0.1:6379> sinterstore mySet3 mySet mySet2 # 获取 mySet 和 mySet2 的交集并存放在 mySet3 中
(integer) 1
127.0.0.1:6379> smembers mySet3
1) "value2"
5)SortedSet(有序)
sortedSet是一个有序不重复的列表。SortedSet里面的每个节点都关联了一个权重,用来排序。SortedSet的底层是hash和跳表(一个很典型的数据机构,牺牲空间来换取时间)。hash的作用是存储每个节点和权重,跳表的作用是用来快速获取一个区间里的节点。
使用场景
直播系统的实时排行榜
常用命令: zadd,zcard,zscore,zrange,zrevrange,zrem 等
6)布隆过滤器
布隆过滤器是一段很长的二进制向量和一系列随机映射函数,用来快速检索一个元素是否在一个集合里。但是他的准确率不是百分之百,有可能判断失误。因此他不适合零失误的场景。
优点:
1,支持海量数据场景下,判断元素是否存在。
2,存储空间占用量小,不存储数据本身,存储的是hash值
3,不存储数据本身,可以用来存储加密数据
缺点:不支持计数,同一个元素可以多次插入,而且效果是相同的。
使用场景:用来解决缓存穿透问题
可以判断用户是否阅读过某篇文章,防止重复推送,比如说抖音。
Redis是一种内存数据库,因其高速读写性能常用于缓存,提升用户体验和系统并发能力。文章介绍了Redis的String、Hash、List、Set、SortedSet等数据结构及其使用场景,并提及布隆过滤器在数据检索中的作用。
6万+

被折叠的 条评论
为什么被折叠?



