这段时间学了Redis,我把网上的一些相关资料做了简单的汇总,记录在此,方便自己以后查阅以及供其他需要者参考
Redis是NoSQL(NoSQL = Not Only SQL),即非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,NoSQL提出了另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,使用这种方式,要获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询,仅仅需要根据key来取出对应的value值即可。
Redis的数据存储在内存中,所以读写速度很快,Redis一般应用于缓存,分布式锁等场景。Redis中的数据一般以键值对的形式存储,有五种数据结构,同时还支持事务。
1.Redis安装
具体安装步骤可以看这篇文章,https://www.runoob.com/redis/redis-install.html 包括了在不同环境下的安装步骤。
安装完后,在window环境下,双击打开redis-server.exe文件,开启后会弹出窗口显示如下
然后双击redis-cli.exe文件,就可以开始使用了。(注意前面的redis-server窗口不要关闭)
通过set和get的方式存储和取出数据
2.Redis数据类型
Redis的数据以键值对的形式存储,键key为string类型
而值value有五种存储形式:
- 字符串类型 string
- 哈希类型 hash
- 列表类型 list(允许重复元素)
- 集合类型 set(不允许重复元素)
- 有序集合类型 zset(sorted set 即有序集合,不允许重复元素)
Redis的常见操作可以看这篇https://blog.csdn.net/sly_7031/article/details/106545765?
3.Redis高性能
- 用户访问传统的关系型数据库,速度会比较慢,因为是从硬盘上读取。Redis是纯内存数据库,是将访问的数据存储在缓存中,访问数据时就可以直接从缓存中获取,所以数据的存取速度快
- Redis中的数据结构是专门进行设计的,数据结构简单,对数据操作也简单
- 采用单线程,保证了每个操作的原子性,避免了不必要的上下文切换和竞争条件,不像多线程那样会有线程切换导致消耗CPU,也不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗,所以效率更高
4.Redis的问题
- 缓存穿透:在同一时刻,有大量的并发请求访问数据库中不存在的信息,因为数据库中没有,所以缓存中也不会有,即既不会命中缓存,也不会命中数据库,导致这些请求都访问数据库,造成数据库压力过大
- 缓存击穿:Redis中的数据是可以设置过期时间的,在某个时间点有大量的并发请求访问缓存中的一个Key,而恰好在这个时间点这个Key刚好过期,或者这个Key并不存在于缓存中,这时大量的请求就直接落到数据库上,没有经过缓存这一层
- 缓存雪崩:缓存中的大量数据在同一时间过期,而后面的查询数据量巨大,导致后面的请求都直接落到数据库上,导致数据库压力过大而宕机
解决方案
- 缓存穿透:使用布隆过滤器,具体实现可以看这篇https://baijiahao.baidu.com/s?id=1655304940308056733
- 缓存击穿:给程序加读写锁,加锁并不需要额外的服务器开销,也不需要额外的资源消耗,仅仅是让线程串行而已,具体实现可以看这篇https://blog.csdn.net/qq_33220089/article/details/102754036
- 缓存雪崩:设置随机过期时间,随机时间是指在原来的过期时间的基础上生成一个随机时间,这个随机时间比较小,然后两者进行相加;设置永久有效,将一部分常用的数据的过期时间设置成为永久有效