理解Redis
一、说到redis,你最先想到的是什么?
什么是redis、redis的数据类型、持久化机制、过期键的删除策略、redis为什么这么快、内存相关的知识、线程模型、事务、集群方案、分区、分布式、缓存异常?
1.什么是redis
redis是高性能、非关系型、键值对数据库;
redis的key是String类型,value有多种类型();
比较mysql和redis的特性:
功能 | redis | mysql |
---|---|---|
读取速度 | ns级别 | ms级别 |
持久化 | AOF和RDB | |
原子性 | 单线程支持 | 不支持,需要特殊处理 |
主从复制 | 支持 | 支持 |
占用资源 | 内存 | 硬盘 |
2.redis为什么之么快
redis是基于内存操作的,数据保存在内存中,类似于HashMap,它的查找和操作时间复杂度是O(1);
redis的数据结构简单,是经过特意设计的,如:String、List、Set、Zset、Hash等数据类型,可以在特定的场景下使用,还有每种数据类型的本地方法;
redis是单线程的,避免不必要的上下文切换和竞争条件,不用考虑各种加锁、释放锁、死锁的问题;
redis通过多路I/O复用,非阻塞模型;
redis直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求 。
3.redis数据结构与使用场景
redis-server.exe redis.window.config
redis-cli.exe -h localhost -p 6379
二、redis的持久化
两种方式:RDB(Redis DataBase 快照),AOF(Append-only file)机制:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-es7DF9SR-1585636753281)(C:\Users\ZJson\AppData\Local\Temp\1583376834035.png)]
三、redis的过期键删除策略
一般的过期策略有三种:定时过期,惰性过期,定期过期。
- 定时过期:每个key有个定时器,到过期时间就会立即清除;对内存大小友好,但会占用大量CUP,影响吞吐量和缓存的响应时间;
- 惰性过期:只有当key被访问时,才判断是否过期,过期删除;对内存不友好,节约大量CUP资源;
- 定期过期:每隔一段时间,扫描一定数量数据库的expires字典的一定数量的key,判断是否过期;
redis使用惰性过期和定期过期策略。
四、内存的淘汰机制有哪些
当redis的内存不足时:
对全局的键所采取的淘汰机制有:noeviction ,allkeys-lru, allkeys-random;
- noeviction: 写入新key时,保存;
- allkeys-lru:移除使用最少的key;
- allkeys-random:随机移除key。
对过期性键有:volatile-lru 、volatile-random 、volatile-ttl。
- volatile-lru:移除最少使用的key;
- volatile-random:随机移除key;
- volatile-ttl:离过期时间最近的key优先移除。
五、redis的线程模型
https://www.cnblogs.com/barrywxx/p/8570821.html
六、分布式锁
- 命令:SETNX(set if not exists)
SETNX lock-key order11
- 官方推荐的RedLock
七、缓存异常
-
缓存雪崩:同一时间缓存key大批量失效,导致请求落到数据库上,造成数据库承受压力而崩掉;
解决:1. 设置key的失效时间为随机时间。
-
缓存穿透:缓存和数据库中都没有的数据,导致请求落在数据库上,造成数据库承受压力而崩掉;
解决:1. 接口校验参数;2.当查询到数据库没有值时,为该key设置一个null值。
-
缓存击穿:缓存中没有,数据库有数据,一般是过期时间到了,用户大量访问该数据,导致请求落在数据库上;
解决:1.热点数据永不过期;2.数据库设置互斥锁。
缓存预热、缓存降级、热点数据和冷数据、
1.下载redis:
linux直接下载:wget http://download.redis.io/releases/redis-5.0.5.tar.gz
官网下载,上传到linux:https://redis.io/download
百度云盘:链接:https://pan.baidu.com/s/1eX8RIeNbUXhj9NAHW1H2CA 提取码:n1qo
guthub:github https://github.com/antirez/redis
2.解压并进入目录:
tar xzvf redis-5.0.5.tar.gz && cd redis-5.0.5
Redis是c语言开发的,需要c语言的编译环境。如果没有gcc需要在线安装,命令:yum install gcc-c++
3.编译:
make
4.在usr/local下创建文件夹:
mkdir /usr/local/redis
5. 安装:
cd redis-5.0.5/src
make install PREFIX=/usr/local/redis
6. 移动配置文件到etc下:
mv redis.conf /usr/local/redis/etc
7.设置配置文件:
在vim编辑模式下,输入行数+gg可以快捷跳行。例如跳到第138行,输入:138gg
编辑配置文件:vim /usr/local/redis/etc/redis.conf
后台启动:将第138行的daemonize no修改为daemonize yes;
远程访问:将第70行的bind注释,第90行将protected-mode改为no;
设置密码:取消第502行的注释,并修改密码: requirepass mytest;
开机启动:
vi /etc/rc.local //在里面添加内容:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf (意思就是开机调用这段开启redis的命令)。
环境变量设置:vim /etc/profile
添加: export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin
8.Redis服务的常用命令
启动: bin/redis-server ../etc/redis-config
停止:bin/redis-cli shutdown 或者
查询出redis的pid,再kill其进程 ps -ef|grep redis kill pid
9.通过"install_server.sh"来安装服务
执行脚本:/redis-5.0.5/utils/install_server.sh
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRvnmlQ6-1585636753282)(C:\Users\ZJson\AppData\Local\Temp\1583414557033.png)]
到6379.conf配置远程访问、后台启动、修改密码;
/etc/init.d/redis_6379:端口为6379的redis服务启动脚本。
上一篇: linux线程与进程的区别
下一篇: 查看linux多少位