缓存的特点:
- 设置存活时间--过期策略(定时/定期/惰性失效)
- 空间占用有限--淘汰策略(FIFO/LRU/LFU)
- 支持并发更新
![](https://i-blog.csdnimg.cn/blog_migrate/cb23467415eeebcd2de71c23dd041e29.png)
1.redis是开源的,数据结构存储在内存中,被用作为数据库,缓存和消息队列;
2.redis是键值对形式存储;key是字符串对象,value支持string,hash,list,set,zset五种类型;
3.redis对象
typedef struct redisObject{
//类型
unsigned type:4;
//编码
unsigned encoding:4;
//指向底层数据结构的指针
void *ptr;
//引用计数
int refcount;
//记录最后一次被程序访问的时间
unsigned lru:22;
}robj
![](https://i-blog.csdnimg.cn/blog_migrate/d3eb410b51c7344dd80a1903ff37588e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c2407ae599735a223592f085add213f2.png)
查询redis进程
ps -ef | grep redis
后台启动
./src/redis-server --daemonize yew
开启客户端
./src/redis-cli
keys * -- 查看所有key
flushall --删除所有key
OBJECT encoding number -- 查看编码
eval "for i=1,512 do redis.call('sadd',keys[1],i) end " 1 bigset --循环插入
scard bigset -- 查看数量513的时候是HT
![](https://i-blog.csdnimg.cn/blog_migrate/4a2c3f5feee1a836004d4ce315349809.png)
list
![](https://i-blog.csdnimg.cn/blog_migrate/c3306e5922ff6f6b13ccb18617d050bf.png)
set
![](https://i-blog.csdnimg.cn/blog_migrate/7f5202d4e01d29b26d101792b17d497f.png)
hash
![](https://i-blog.csdnimg.cn/blog_migrate/38428c4c37c0b0cfa73a5898b386e1a5.png)
zset
![](https://i-blog.csdnimg.cn/blog_migrate/cbe3e944135c01271809eb7ded91e582.png)
应用:
分布式锁:
![](https://i-blog.csdnimg.cn/blog_migrate/9edf2e04d93bdbf877beeb35f2d06841.png)
雷区:
- 锁过期--->续租,增加过期时间
- 重叠解锁--->value中添加唯一表示(线程ID),避免解别人的锁'
- 单点问题(中宕机,从中没有锁信息)-->redlock算法
消息队列
![](https://i-blog.csdnimg.cn/blog_migrate/51f2b536cc33f0e7b324686004f88f64.png)
redis数据库(内存),内存中存储问题,服务挂掉数据可能丢失;==>持久化 RDB/AOF
RDB 手工执行和服务器自动定期执行.二进制文件,保存的就是数据
AOF
- 通过追加的形式记录redis命令实现数据的一致
- 写入缓冲区===>同步到磁盘
![](https://i-blog.csdnimg.cn/blog_migrate/e5b756b1f678aa98767df60043d74aff.png)
AOF越来越大时==>空间浪费,数据加载慢;多条命令保存,有很大几率浪费(许多命令不需要保存)
==>AOF重写:
- fork子线程,不影响主线程的操作;同时有一个重写缓冲区,主线程会同步到重写缓冲区,保证数据的一致性
![](https://i-blog.csdnimg.cn/blog_migrate/bc1ccb9455ec74cb838621f8856fa611.png)
![](https://i-blog.csdnimg.cn/blog_migrate/048738cce5b749e3be8fc5b622e1bf07.png)