欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

理解Redis

程序员文章站 2022-03-05 10:05:38
...

一、说到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的过期键删除策略

一般的过期策略有三种:定时过期,惰性过期,定期过期

  1. 定时过期:每个key有个定时器,到过期时间就会立即清除;对内存大小友好,但会占用大量CUP,影响吞吐量和缓存的响应时间;
  2. 惰性过期:只有当key被访问时,才判断是否过期,过期删除;对内存不友好,节约大量CUP资源;
  3. 定期过期:每隔一段时间,扫描一定数量数据库的expires字典的一定数量的key,判断是否过期;

redis使用惰性过期和定期过期策略。

四、内存的淘汰机制有哪些

当redis的内存不足时:

对全局的键所采取的淘汰机制有:noeviction ,allkeys-lru, allkeys-random;

  1. noeviction: 写入新key时,保存;
  2. allkeys-lru:移除使用最少的key;
  3. allkeys-random:随机移除key。

对过期性键有:volatile-lru 、volatile-random 、volatile-ttl

  1. volatile-lru:移除最少使用的key;
  2. volatile-random:随机移除key;
  3. volatile-ttl:离过期时间最近的key优先移除。

五、redis的线程模型

https://www.cnblogs.com/barrywxx/p/8570821.html

六、分布式锁

  1. 命令:SETNX(set if not exists)

SETNX lock-key order11

  1. 官方推荐的RedLock

七、缓存异常

  1. 缓存雪崩:同一时间缓存key大批量失效,导致请求落到数据库上,造成数据库承受压力而崩掉;

    解决:1. 设置key的失效时间为随机时间。

  2. 缓存穿透:缓存和数据库中都没有的数据,导致请求落在数据库上,造成数据库承受压力而崩掉;

    解决:1. 接口校验参数;2.当查询到数据库没有值时,为该key设置一个null值。

  3. 缓存击穿:缓存中没有,数据库有数据,一般是过期时间到了,用户大量访问该数据,导致请求落在数据库上;

    解决: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服务启动脚本。