1.背景介绍
什么是redis?
redis是一个key-value存储系统,与memcached类似,redis将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关读写操作。redis使用c语言开发,支持的客户端语言也非常丰富,其中自然包括了Java语言。当前redis的应用已经十分广泛,国内像新浪、淘宝,知乎等均在使用redis的缓存服务
为什么要使用缓存?
机械硬盘的读写速度:50-90MB/s
固态硬盘的读写速度可以达到:500MB/s
内存DDR3 1333Hz的读写速度大概在8G/s
读写次数:mysql 读8000次/s 写4000次/s
redis 读写速度在10万次/s
redis是基于内存操作的高性能服务器存储应用,读写速度很快,作为内存型缓存服务器时,它支持的数据类型比较丰富,而且提供了持久化的存储方案,在一些开发场景中甚至可以作为结构不复杂的数据库来使用
2.知识剖析
redis支持的两种持久化数据方式:RDB(Redis DataBase)和AOF(Append Only File)。
1.RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上
2.AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
redis支持的5种数据类型及基本操作
String(字符串):对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement)
List(链表):从链表的两端推入或者弹出元素;根据值来查找或者移除元素
Set(集合):添加、获取、移除单个元素;检查一个元素是否存在于某个集合中;计算交集、并集、差集
Zset(有序集合):添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素
Hash(散列):添加、获取、移除单个键值对;获取所有键值对
redis的常用配置
1.daemonize 默认为no,改为yes可以使其后台运行
2.bind 默认127.0.0.1,ip地址为允许访问该redis的主机,注释掉可以让所有主机访问
3.port 默认6379
4.timeout 默认为0(永不关闭),表示一直没有请求发到redis服务器的客户端连接超时时间
5.requirepass redis密码,在向redis服务器发起请求之前需要验证的参数,可以不写
redis使用场景
1、取最新的N个数据的操作
比如当你要取网站的最新的500条文章,我们可以将最新的500条文章的ID放在redis的List链表中,每有用户发布一篇文章就向链表左边插入一条数据,取的时候按照链表顺序从左边开始取500条,就能拿到对应的最新500条文章的ID,更加细化的读取操作可以方便的达到分页的功能
2、排行榜应用,取Top N操作
比如按照点赞的次数给文章排名,我们可以使用有序集合实现,将点赞数设置成sortset的score,将具体的文章ID设为字符串成员member,每次执行一条ZADD命令即可
3、需要精准设置过期时间的应用
redis支持过期功能,比如短信验证码的时效性可以通过设置过期时间来决定
4、计数功能
redis的命令都是原子性的,我们可以轻松利用INCR,DECR命令来构建计数器,完成计数功能,比如记录同一号码一天内不能超过三次请求发送验证码
5、唯一约束的数据
使用redis的set(集合)数据结构就可以自动排重了
6、常用的缓存功能
比如和mysql连用时临时存储数据提高访问速度
3.常见问题
1、redis和mamcached主要区别?
2、如何使用java操作redis?
4.解决方案
区别:
1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
2 Redis支持数据的备份,即master-slave模式的数据备份。
3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
5.编码实战
6.扩展思考
redis在开发中能够完全取代传统数据库(如mysql)吗?
1.redis虽然在许多项目中已经被直接当成数据库来使用,但是在许多复杂场景中,还是mysql等传统数据库才能胜任
2.Redis本来就是内存数据库,用来当做计数器,队列等的确很不错,性能高效。但是若是对此了解不够深入,或者受到架构的约束,在需求更新时会遇到巨大的困难,BAT也有许多项目大量使用redis作为存储机制,不过他们已经对redis进行了个性定制和扩展.
3.redis不支持实体完整性约束,不支持用户完整性约束和关联完整性约束校验,要保证数据低冗余和无差错时十分困难的,以现在业界开发人员的平均水平来说,传统数据库的开发效率还是更胜一筹.
7.参考文献
https://www.cnblogs.com/Hondsome/p/5962144.html