Redis回收使用的是LRU算法。
LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。
Redis2.6版本开始redis-cli支持一种新的数据插入方式,被称之为pipe mode的新模式,用于执行大量数据插入工作。
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。
Redis数据类型都是基于基本数据结构,同时对开发人员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。
内存数据库方面的优点是在内存比在磁盘上相同复杂的数据结构上操作更为简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面它们是紧凑并以追加的方式产生,因为它们并不需要进行随机访问。
1)Redis是单进程单线程的。使用了I/O多路复用器,高并发情况下不存在数据安全问题;而Memcached支持多线程。
2)Redis存储K-V结构的数据,Value支持多种数据类型,比如String、Hash、Set、SortedSet、List类型;而Memcached仅支持简单的K-V结构的数据。
3)Redis支持数据持久化,服务器重启后数据可以恢复;而Memcached不支持数据持久化,服务器重启后数据无法恢复。
4)Redis中List类型支持排序;而Memcached不支持排序。
5)Redis中value值最大可以存储512MB;而Memcached中key的最大长度为255个字符,value最大可以存储1MB。
6)Memcached和Redis在数据的写入上效率基本相差无几,但是在数据的读取尤其是批量数据的读取时,Memcached的效率更高。
Memcached是缓存系统,通过名字就可以看出来,官网也明确说了(Free & open source, high-performance, distributed memory object caching system),也就是指Memcached不会作为可靠的数据存储,不支持持久化数据。
Redis使用单核,而Memcached可以使用多核,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis。虽然Redis最近在存储大数据的性能上进行优化,但是比起Memcachedd,还是稍有逊色。
1、延迟操作
订单入库时数据量过于庞大,可以用于Redis缓存数据量,减轻数据库压力,再分批处理数据。
2、点赞、好友等相互关系
点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。
3、Session共享
使用Redis可以实现单点登录,通过expire控制是否失效问题。集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。
4、分布式锁
在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。
5、计数器
什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。
6、排行榜
很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。使用Redis中SortedSet类型进行数据的排序。
7、模糊搜索
数据量大时可以使用Redis缓存,进行模糊搜索。Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。
8、消息队列
消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。注意的是Redis不能和专业的消息中间件相比。Redis支持list push和list pop命令,因此很方便的执行队列操作。
9、限流
采用redis的key过期策略,将业务id和业务值存起来设置一定的过期时间,等请求再次进入时,如果有值,则认为是重复性请求,反之过滤掉该请求。
Redis当做缓存使用时,可以通过一致性哈希实现动态扩容缩容。
Redis当做持久化存储数据使用时,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。
内存资源。
如果达到设置的上限,Redis的写命令会返回错误信息,但是读命令还可以正常返回。
可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
尽量使用redis的散列表,把相关的信息放到散列表里面存储,而不是把每个字段单独存储,这样可以有效的减少内存使用。
可以通过使用Hash、list、sorted set、set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。
比如web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是把这个用户的所有信息存储到一张散列表中。
Redis-rb、Predis等。
Redis事务的本质是通过MULTI、EXEC、WATCH等一组命令的集合。
事务支持一次执行多个命令,一个事务中所有命令都会被序列化。
在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。搜索公众号“Java精选”,回复“面试资料”。
总的来说就是redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
使用info命令。
Redis是单进程程序且保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。因此,Redis的事务是总是带有隔离性的。
Redis中单条命令是原子性执行的,但事务不能保证原子性,且没有回滚。
事务中任意命令执行失败,其余的命令仍会被执行。
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
Redis并不能保证数据的强一致性,也就是说在实际中Redis集群在特定的条件下可能会产生数据丢失的情况。
异步复制。
可以在同一个服务器部署多个Redis的实例,并把它们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果使用多个CPU,可以考虑一下分片(shard)。