Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。由于读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
一、Redis数据库为什么被广泛的采用了,总结起来无外乎这几点,1.纯内存操作 ,2.单线程 , 3.高效的数据结构, 4.合理的数据编码, 5.其他方面的优化。
二、redis 常见数据结构以及使用场景分析
1.String: 常用命令: set,get,decr,incr,mget 等。
String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 常规key-value缓存应用; 常规计数:微博数,粉丝数等。我所在的公司使用 String数据存储手机号的验证码。
2.Hash:hget,hset,hgetall 等。
hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以 hash 数据结构来存储用户信息,商品信息等等。
3.List:常用命令: lpush,rpush,lpop,rpop,lrange等
list 就是链表,Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用Redis的 list 结构来实现。
4.Set:常用命令: sadd,spop,smembers,sunion 等
set 对外提供的功能与list类似是一个列表的功能,特殊之处在于 set 是可以自动排重的。当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。可以基于 set 轻易实现交集、并集、差集的操作。比如:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。
5.Sorted Set:常用命令: zadd,zrange,zrem,zcard等
和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 Sorted Set 结构进行存储。
总结起来几点: String:缓存、计数器、分布式锁等。List:链表、队列、微博关注人时间轴列表等。Hash:用户信息、Hash 表等。Set:去重、赞、踩、共同好友等。Zset:访问量排行榜、点击量排行榜等。
三、处理高并发的应用场景,当一个用户操作登陆app,要查询app首页的商品,假如用户每次访问读取数据库的存储数据,当用户量过大这样会消耗数据服务器大量的资源,导致页面数据加载过慢,所以我们采用redis数据库将用户访问的数据存在缓存里面这样降低数据库服务器的压力,大大提高服务器的性能,进一步提高用户的体验行。
四、 redis 如何处理过期数据
下面介绍三种删除策略:
定时删除:在这是键的过期时间的同时,创建一个定时器 Timer,让定时器在键过期时间来临时立即执行对过期键的删除。
惰性删除:键过期后不管,每次读取该键时,判断该键是否过期,如果过期删除该键返回空。
定期删除:每隔一段时间对数据库中的过期键进行一次检查。
定时删除:对内存友好,对 CPU 不友好。如果过期删除的键比较多的时候,删除键这一行为会占用相当一部分 CPU 性能,会对 Redis 的吞吐量造成一定影响。
惰性删除:对 CPU 友好,内存不友好。如果很多键过期了,但在将来很长一段时间内没有很多客户端访问该键导致过期键不会被删除,占用大量内存空间。
定期删除:是定时删除和惰性删除的一种折中。每隔一段时间执行一次删除过期键的操作,并且限制删除操作执行的时长和频率。
五、个人总结:
Redis 为高性能,高并发而生,因此在企业中得到广泛的运用,在大数据的今天redis也得到广泛的运用。