Redis基本知识点
一、概念
Redis是一款内存高速缓存数据库。全称为:Remote Dictionary Server(远程数据服务),
该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:
String、list、set、zset(sorted set)、hash.
Redis采用的是基于内存的单进程单线程模型的KV数据库。官方提供的数据是可以达到10W+QPS。
二、Redis单线程处理效率高的原因
- 纯内除操作
- 核心是基于非阻塞的IO多路复用机制
- C语言使用,一般来说,C语言事先的程序“距离”操作系统更近,执行速度会更快
- 单线程反而避免了多线程的频繁上下文切换问题,预防了多线程产生的竞争问题。
- 底层实现了VM机制,避免了调度系统指令,从而浪费了一定的时间去移动和请求
三、支持的数据类型
String、list、set、zset(sorted set)、hash
字符串类型的值最大容量为512M
四、为什么redis要把所有数据放在内存中
redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度会严重影响到redis的性能。
五、Mysql当中有2000W数据,redis只存20W数据,如何保证redis当中的数据都是热点数据
redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
对应的数据淘汰策略如下:
1、热点数据排序(点击次数)
既然热门数据,那么就需要有排序,使用redis中的zset数据类型是很自然的想法。数据中的某个唯一字段作为zset中的value,而点击次数作为score,记为click_zset。这样就可选出最热门的数据。而数据,则直接用HashMap存储。
2、热点数据时间(近期访问)
既然只能存1w条数据且需要是热门数据,那么,点击次数是一方面,时效性也是一方面,如何保证?可以另起一个zset,数据的字段为value,而每次点击时更新当前时间戳为其score,记为time_zset这样,就可以记录时间。在后台跑一个任务,间隔一定时间段删除两个zset中长时间没有发生点击事件的键,并删除hash数据,为产生的新数据腾出数据空间。
3、处理新热点数据
如果有空间,则保存到自己的hashmap,并将key存到两个zset中。
而没有空间时,就应该在click_zset中取出点击次数排在最前第1w位后面的键,删除对应的hash数据。然后看这1w个score的值,然后把key放入两个zset中即可。
六、其余问题
-- Redis集群的最大节点个数是多少?
16394个
七、redis指令
- keys pattern
- set key value
- get key
- setnx key value // 存在则不生效
- mset key1 vallue1 key2 value2 …
- mget key1 key2 …
- epire
- select 0 | move xxx 1
八、分布式锁
使用setnx代替sex
setxn key1 value1
expire key1 600