一,搭建环境

Windows环境搭建

redis-server.exe --service-install redis.windows.conf [–loglevel verbose] – 服务部署
卸载服务:redis-server --service-uninstall
开启服务:redis-server --service-start
停止服务:redis-server --service-stop
启动客户端:redis-cli.exe -h 127.0.0.1 -p 6379 -a requirepass
Redis桌面管理工具[下载地址:https://redisdesktop.com/download]
Redis如何设置密码及验证密码
设置密码:config set requirepass 123456
授权密码:auth 123456
删除密码:config set requirepass “”
针对当前启动的服务设置密码,卸载之后,重新安装还需要进行设置密码

linux 环境搭建

官网
$ wget https://download.redis.io/releases/redis-6.2.1.tar.gz

提示wget命令没有找到,执行:yum -y install wget

$ tar xzf redis-6.2.1.tar.gz
$ cd redis-6.2.1
$ make

make:linux中make是用来编译的,它从Makefile中读取指令,然后编译
make:异常
错误信息: cc: command not found
解决方案:yum -y install gcc gcc-c++ libstdc+±devel
make:异常(fatal error:jemalloc/jemalloc.h:no such file or directory)
make MALLOC=libc(编译时添加参数防止Linux下make报错)
make test : 异常 you need tcl 8.5 or newer
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/
cd /usr/local/tcl8.6.1/unix/
./configure
make
make install

启动服务端 【$ src/redis-server 】【不指定conf,使用默认的配置,正式使用时需要配置启动的conf文件】
启动客户端【$ src/redis-cli】

创建redis文件夹并将源文件中的服务器和客户端移入
$ mkdir -p /usr/local/redis
$ cp /usr/local/src/redis-5.0.4/src/redis-server /usr/local/redis/
$ cp /usr/local/src/redis-5.0.4/src/redis-cli /usr/local/redis/

设置Redis开机自启动
$ cd /usr/local/src/redis-5.0.4/utils
$ ./install_server.sh

出现 This systems seems to use systemd 错误,
则 vi ./install_server.sh 注释对应的代码即可
conf 指定文件
log /var/log/redis_6379.log
data /var/lib/redis/6379
Copied /tmp/6379.conf => /etc/init.d/redis_6379【软连接】

#查看redis进程
$ ps -ef | grep redis

#修改redis配置
$ whereis redis
$ vim /etc/redis/6379.conf
#找到并注释掉 bind 127.0.0.1
#bind 127.0.0.1 #限制IP
daemonize yes # 以后台守护进程方式运行
protected-mode no
requirepass 123456 # 设置密码

#重启redis服务器
$ service redis_6379 restart
在unils 文件夹下执行

#端口添加防火墙
$ firewall-cmd --zone=public --add-port=6379/tcp --permanent
#重启防火墙
systemctl reload firewalld
systemctl start firewalld
systemctl stop firewalld

#建立redis客户端命令的软连接
$ ln -s /usr/local/redis/redis-cli /usr/bin/redis【软连接】
$ redis
127.0.0.1:6379> AUTH 123456

#开启关闭redis服务
$ service redis_6379 start
$ service redis_6379 restart
$ service redis_6379 stop

查看redis 服务端版本
redis-server -v
链接客户端,执行 info 命令

二,CAP

C:Consistency
一致性:指的是强一致性,也就是数据更新完,访问任何节点的数据完全一致,要和弱一致性,最终一致性区分开来
A:Availability
可用性:指高可用还包括不能出现延迟,比如节点B等待数据同步而阻塞请求,任何没有发生故障的服务必须在有限的时间内返回合理的结果集
P:Partiton tolerence
分区容忍性:指网络意义上的分区。由于网络是不可靠的,所有节点之间很可能出现无法通讯的情况,在节点不能通信时,要保证系统可以继续正常服务
base【基本可用 ba;软状态 s;最终一致 e】
redis实现的分布式锁。redis分布式锁的最致命的问题就是无法保证数据的一致性,如果一旦主节点宕机,数据没有同步到从节点中,会出现再次上锁的问题,如果业务一定需要数据的一致性在高并发的场景下是不建议选择redis锁的实现,可以选择CP模型的zk或者etcd来实现分布式锁

三,master-slave

数据备份 & 读写分离 & 容灾恢复
相关配置
requirepass ***
slaveof <masterip/slaveip>
masterauth <master/slave - password>
相关命令
info replication 查看信息
slaveof 127.0.0.1 6379 - 显示指定配置当前实例为从节点
slaveof no one - 脱离从节点
哨兵模式 slaveof no one 的自动版本
三个特性:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作
sentinel配置文件:sentinel.conf【必须这样命名】
sentinel配置文件内容:
port 26379【检测的端口】
sentinel monitor mymaster 127.0.0.1 6379 2【表示有两个服务认为主服务挂了才是挂了】
sentinel auth-pass mymaster 123456
daemonize yes【开启后台运行模式,linux 上使用】
配置文件:
requirepass / masterauth 建议密码设置一样
slaveof 建议不配置,通过命令指定
启动服务:redis-server.exe sentinel.conf --sentinel
TIPS:主从配置通过命令配置,当master服务宕掉重启之后,会自动把服务设置为slave,指向之前投票选举的新master
缺点:
1.切换需要时间丢数据
2.没有解决 master 写的压力
优点:
1.高可用

四,cluster

集群搭建

1,至少有六个节点,三个master,一个master 至少一个slave
2,集群启动前,把rdb, aof和nodes.conf 文件都删除了
3,文件配置 端口号修改都不一样,cluster-enabled yes 开启
4,创建一盒.sh 脚本【chmod u+x start-all.sh 赋予脚本可执行权限】,把所有启动的redis 都写进去,执行
5,此时的节点虽然都启动成功了,但他们还不在一个集群里面,不能互相发现,测试会报错:(error) CLUSTERDOWN Hash slot not served
如果你是redis5.0以前的,你需要安装集群所需的ruby相关依赖
redis5.0及之后的,无需安装ruby依赖,redis安装目录里内置了集群命令行工具 redis-trib ,它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片工作
命令:redis-cli --cluster create 192.168.93.130:7002 192.168.93.130:7003 192.168.93.130:7004 192.168.93.130:7005 192.168.93.130:7006 192.168.93.130:7001 -a 123456 --cluster-replicas 1
6,客户端连接:redis-cli -c -h 192.168.119.128 -p 9001

故障转移

1,集群中的节点会向其它节点发送PING消息(该PING消息会带着当前集群和节点的信息),如果在规定时间内,没有收到对应的PONG消息,就把此节点标记为疑似下线。
2,当被分配了slot槽位的主节点中有超过一半的节点都认为此节点疑似下线,那么该节点就真的下线。
3,其它节点收到某节点已经下线的广播后,把自己内部的集群维护信息也修改为该节点已事实下线。
4,节点资格审查:然后对从节点进行资格审查,每个从节点检查最后与主节点的断线时间,如果该值超过配置文件的设置,那么取消该从节点的资格。
5,准备选举时间:这里使用了延迟触发机制,主要是给那些延迟低的更高的优先级,延迟低的让它提前参与被选举,延迟高的让它靠后参与被选举。(延迟的高低是依据之前与主节点的最后断线时间确定的)
6,选举投票:当从节点获取选举资格后,会向其他带有slot槽位的主节点发起选举请求,由它们进行投票,优先级越高的从节点就越有可能成为主节点,当从节点获取的票数到达一定数值时(如集群内有N个主节点,那么只要有一个从节点获得了N/2+1的选票即认为胜出),就会替换成为主节点。
7,替换主节点:被选举出来的从节点会执行slaveof no one把自己的状态从slave变成master,然后执行clusterDelSlot操作撤销故障主节点负责的槽,并执行 clusterAddSlot把这些槽分配给自己,之后向集群广播自己的pong消息,通知集群内所有的节点,当前从节点已变为主节点。
8,接管相关操作:新的主节点接管了之前故障的主节点的槽信息,接收和处理与自己槽位相关的命令请求。
细节配置
master 配置
关闭rdb,备份交给 slave
可以起开aof (当从服务器上开启aof,那么主服务器就不要开启了)
slave配置(无配置时,集群管理命令默认前面是主服务器,后面是从服务器)
声明 slaveof
配置密码,如果主节点有配置密码
某一个slave 打开 rdb
配置是否只读 slave-read-only
Redis集群集群不可用
有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。
使用注意
Redis集群目前无法做数据库选择,默认在0数据库
MGET
缺点
数据通过异步复制,不保证数据的强一致性
优点
解决了redis的写压力
127.0.0.1:7000>cluster meet 127.0.0.1:7001

五,持久化

Redis的持久化存储提供两种方式:RDB与AOF。RDB是默认配置。AOF需要手动开启

rdb[Redis DataBase]

功能核心:函数rdbSave(生成RDB文件) rdbLoad(从文件加载内存)两个函数
作用:在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时时将快照文件直接读到内存里
过程:单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的
优势:适合大规模的数据恢复,对数据完整性和一致性要求不高
劣势:在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改,fork(分叉)的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
如何恢复 - 将备份文件(dump.rdb) 移动到 redis 安装目录并启动服务即可。
命令触发 - save(会阻塞)命令调度rdbSave函数
BGSAVE:镜像全量持久化,因为bgsave耗时长,在停机的时候会导致大量丢失数据。可以通过lastsave命令获取最后一次成功执行快照的时间
配置项
rdbchecksum:在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约,10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
rdbcompression:对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用,LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能
stop-writes-on-bgsave-error:如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制
dbfilename: 文件名称
dir :文件目录,aof和rdb文件

AOF【append only file】

作用
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,
redis启动之初会读取该文件重新构建数据,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
劣势
相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同
配置项
appendfilename
“appendonly.aof” 默认的文件名
appendonly no (是否开启aof持久化)
默认不开启
appendfsync
always:同步持久化每次write后都会调用fsync(Linux为调用fdatasync)
everysec:出厂默认推荐,异步操作,每秒记录,每秒调用一次fsync
这种模式性能并不是很糟糕,一般也不会产生毛刺,这归功于Redis引入了BIO线程,所有fsync操作都异步交给了BIO线程。
no:则write后不会有fsync调用,由操作系统自动调度刷磁盘,性能是最好的
另外,Redis在处理一条命令时,并不立即调用write写AOF文件,只是将数据写入到AOF buffer(server.aof_buf)中。调用write和命令处理是分开的,Redis只在每次进入epoll_wait之前做write操作。
no-appendfsync-on-rewrite:
重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性
auto-aof-rewrite-min-size:
设置重写的基准值,默认64M
auto-aof-rewrite-percentage:
设置重写的基准值 percentage百分比,默认100
aof-load-truncated
yes:加载时碰到异常数据,截断
no:抛异常,需要用redis-check-aof 修复
总结(Which one)
aof文件比rdb更新频率高,优先使用aof还原数据。
aof比rdb更安全也更大
rdb性能比aof好
建议
1,master 尽量不要任何一种持久化,在slave 中实现
2,RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则
3,开启aof。代价一是带来了持续的IO,二是AOF rewrite【rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的,AOF重写的基础大小默认值64M太小了,可以设到5G以上
4,如果不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,新浪微博就选用了这种架构
5,aof文件过大恢复时间过长怎么办,Redis会定期做aof重写,压缩aof文件,可以手动调用压缩命令
,Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理
6,bgsave的原理是,fork和cow,fork是指redis通过创建子进程来进行bgsave操作,cow指的是copy on write【在不影响写的基础上复制数据】
Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程

六,redis配置文件

bind
指定本机网卡对应的IP地址
简单操作 ipconfig 出现的ipv4 地址都可以绑定 和 127.0.0.1,绑定之后只能通过对应ip能访问
如果我们想限制只有指定的主机可以连接到redis中,我们只能通过防火墙来控制
使用阿里云的安全组,来限制指定的主机连接6379端口
bind 127.0.0.1 只能本机访问,
bind 192.168.. 同一局域网能访问
bind 0.0.0.0 能通过本机ip的都能访问
# bind 表示所有主机都可以
前提:你的服务器必须开放redis的端口
protected-mode
一个安全层,作用:就是只有【本机】可以访问redis。这个安全层开启必须满足三个条件,不然安全层处于关闭状态
1)protected-mode yes(处于开启)
2)没有bind指令。原文:The server is not binding explicitly to a set of addresses using the “bind” directive.
3)没有设置密码。原文:No password is configured。
includes
应用外部的*.conf文件
maxmemory
当内存多少时,触发策略淘汰,默认被注释,
如果不设置或者设置0,在64位系统下不限制内存,在32位操作系统最多使用3G数据
一般配置为物理内存的3/4,
动态修改内存大小:config get maxmemory;config set maxmemory
查看内存情况:客户端,info [信息居多] ,或者 info memory
内存满了,继续插入会报OOM错误
maxmemory-policy
策略淘汰数据
noeviction:don’t expire at all, just return an error on write operations
allkeys-lru:尝试回收最少使用的键(LRU),使得新添加的数据有空间存放
volatile-lru:尝试回收最少使用的键(LRU),但仅限于在过期集合的键
allkeys-random:回收随机的键使得新添加的数据有空间存放
volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键
volatile-ttl:回收在过期集合的键,并且优先回收存活时间(TTL)较短的键
allkeys-lfu: 按次数使用最少的
volatile-lfu:
LRU (Least recently used) 最近最少使用,如果数据最近被访问过,那么将来被访问的几率也更高
LFU (Least frequently used) 最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小

maxmemory-samples
设置样本数量,Lru算法和罪行ttl算法都并非是精确的算法,而是估算的,所以你可以设置样本的大小
redis默认会检查这么多个key,并选择其中lru的那个
默认的5可以产生足够好的结果。10非常接近真正的LRU,但花费更多的CPU。3是非常快,但不是非常准确。默认不开启
save
RDB 持久化配置
save
save 900 1【900秒(15分钟)内有1个更改】
timeout
客户端空闲N秒后关闭连接(0为禁用/默认)
tcp-keepalive
单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60
loglevel
日志级别,debug、verbose、notice、warning,默认为verbose
logfile
日志名称, logfile stdout
默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
tcp-backlog
设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。
dir
指定本地数据库存放目录 dir ./ 当前目录下
pidfile
pidfile /var/run/redis.pid【这个是记录redis-server进程的pid,pid 亦即 Process ID】
当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
Port
因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
maxclients
设置同一时间最大客户端连接数,默认10000,如果设置 maxclients 0,表示不作限制
当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

七,redis配置文件

基本命令
shutdown
keys *
可以扫出指定模式的key列表【keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复】
集群,keys a* 只能查询当前节点列表
scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,耗时
Exists : key
ttl: key查看还有多少秒过期,-1表示永不过期,-2表示已过期
expire: key 秒钟:为给定的key设置过期时间
persist: key(取消过期时间),即设置永久
movekey: 在当前库移除了
move : 移动key到另一个库
del: 删除key
type : 查询key类型
Select 0 //选择数据库
rename
对一个 key 进行改名,那么改名后的 key的生存时间和改名前一样
改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除
dbsize 查看当前数据库的key的数量
flushdb:清空当前库
Flushall;通杀全部库
String
set、get
set key val [ex seconds] [px milliseconds] [nx|xx]
strlen:获取值长度
Incr key:对一个不存在的 key,默认0,并设置key为 1并返回
incrby key num:同 incr 类似
Decr key:对一个不存在 key,默认0,则设置 key 为-1并返回
Decrby key num:同 decr
setex key secondTime v:
setnx key value:如果 key 已经存在,返回 0
Mset:一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。
Mget:一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nuil。
append:追加 value,返回新字符串值的长度。
getrange/setrange:获取指定区间范围内(包含边界)的值,从零到负一表示全部
msetnx:设置多个不存在的key,如有key有存在,则失败
getset(先get再set):将给定 key 的值设为 value ,并返回 key 的旧值(oldvalue),先get然后立即set,旧值没有返回nil
Hash
hset、hget:
hexists : key field 某个值key
hlen:查询个数
hkeys :查询所有的键
hvals :查询所有的值
hmset:设置多个键对应的值 hmset key field value [field value]
hmget:获取多个键对应的值 hmget key field field
hgetall:获取所有的键值对
hdel:删除对应的field
hsetnx: 不存在添加
hincrby:设置一个field增加多少
hincrbyfloat:设置一个field增加多少浮点型
List(列表)
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
lpush/rpush:左边 / 右边 添加数据
lpop/rpop:从队列左边右边弹出元素
llen key:查询列表长度
lrange key indexS indexE:获取对应索引的值 0开始,包含开始结束元素
lrem key count val :删除相同的值多少count,-count 从表尾检索,0 删除全部相同value的值
lindex:通过索引获取列表中的元素
ltrim :ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
rpoplpush :源列表 目的列表:移除列表的最后一个元素,并将该元素添加到另一个列表并返回
lset key index value:修改对应索引的值
linsert : key before/after 值1 值2,before位于左边
如果值全移除,对应的键也就消失了
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了
Set(集合)
Redis的Set是string类型的无序集合。它是通过HashTable实现实现的,所以添加,删除,查找的复杂度都是O(1)
sadd :添加 重复的 不会进入
smembers :查出所有的key
sismember :k1 值1 查看是否k1中存在值1
scard : 获取元素集合的个数
srem:key value 删除key集合中的value值
spop: key 随机出栈,删除
srandmember:srandmember key num ; 随机取出 n个值,不删除
smove : key1 key2 值1 从key1中 移走值1 到 key2中
数学集合类
差集 sdiff k1 k2 ; 在第一个中 不在第二个中
交集 sinter k1 k2 ;在第一种也在第二种
并集 sunion k1 k2;在第一种或在第二种
应用场景
微信抽奖小程序【sadd scard spop/srandmember】
微信朋友圈点赞【sadd(id) srem smembers scard sismember】
微博好友关注社交关系
qq内推可能认识的人
Sorted Set(Zset)
增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。默认升序排列
zadd key score value :添加,值相同覆盖分数
zrange key indexS indexE:通过索引查找元素,可选是否带分数,0 -1 查找全部 【withscores】
zrevrange key indexS indexE:逆序通过索引获取值
zrem key value:删除指定的值
zcard:返回元素数量
zcount key scoreS scoreE:有个分数范围返回数量,包括起终分数
zrangebyscore key scoreS socreE [withscores]:
zrevrangebyscore key scoreE scoreS:逆序,通过分数从大到小输出
zrank key value:获取下标值
zrevrank key value :作用是逆序获得下标值
zscore key value 获取对应的分数
应用场景
抖音热搜
根据商品销售对商品进行排序显示
BITMAP
setbit key offset value(0/1)
getbit key offset
bitcount key [start end]:针对ascii码来说,set a “ddd”; bitcount a 1 1
bitop operation destkey key… :operation [ or and not xor] not 时只能有一个key
HyperLogLog
pfadd key value
pfcount key
pfmerge destkey key… :合并
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数
GEO
地理相关
事务
multi:开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列
exec:执行事务中的所有操作命令
discard:取消事务,放弃执行事务块中的所有命令
watch key [key…]:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。
unwatch:取消WATCH对所有key的监视。

八,雪崩、击穿、穿透

缓存穿透:是指数据库、缓存中都不存在,而用户不断得发起请求,导致数据库压力过大,甚至严重会击垮数据库。
1,采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤
2,拦截器,id<=0的直接拦截,基于业务的简单判断
3,从cache和db都取不到,可以将key-value写为key-null,设置较短过期时间,或者该key对应的数据insert了之后清理缓存。
4,对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤

缓存雪崩:某一时刻大面积key失效,那么在高并发得情况下,所有得请求都会落在DB,对DB造成过大得压力
1,批量向redis中存放数据时,把每一个得key得失效时间加一个随机值
2,如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中,设置热点数据永远不过期
3,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待

缓存击穿:指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库就像在一个完好无损的桶上凿开了一个洞。
解决缓存击穿:设置热点数据永远不过期。加互斥锁

九,问答

为什么要用pipeline?
答,可以将多次IO往返的时间缩减为一次
是否使用过Redis集群,集群的原理是什么?
Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务
单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率
epoll【能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率】
过期Key删除策略?
不建议使用定时删除策略【弊端:用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源】
采用定期删除【每隔100ms,随机抽查删除】+ 惰性删除【获取时判断过期就删除】+ 内存淘汰机制【volatile-lru】
集群时使用 Mget?
如果key 不在一个slots 中,已抛异常【(error) CROSSSLOT Keys in request don’t hash to the same slot】
需要找支持MGET的客户端,实现方式在客户端整合数据返回
关于并发?
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问,消除了传统数据库串行控制的开销,Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争
但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成
Redis做异步队列?
使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试
list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来
生产一次消费多次?
pub/sub主题订阅者模式,可以实现1:N的消息队列【缺点:在消费者下线的情况下,生产的消息会丢失】
如何实现延时队列?
使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理
reids集群为什么有16384个槽?
CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值,redis 集群主节点基本不可能超过1000【太大会导致 ping pong 占用带宽过高】, 如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大,16384 2k ,8192 1k,消息头 myslots[CLUSTER_SLOTS/8] 发送节点负责槽信息,
redis 为什么并发高?
基于内存 和 nio (select 模式)

使用:
redis 做缓存,减少数据库压力,提高性能,分布式锁,解决并发冲突,单点登录,排行榜,计数器,布隆过滤器,消息队列,发布订阅

Redis 互联网开发必看相关推荐

  1. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  2. Android开发必看知识,不看后悔

    Android开发必看知识,不看后悔 打包为大家奉上最实用最给力的资源,不看你绝对后悔. 最强大的UI特效 奇艺高清UI界面源代码 http://www.eoeandroid.com/thread-1 ...

  3. 【珍藏】 2012.NET开发必看资料53个+经典源码77个—下载目录

    2019独角兽企业重金招聘Python工程师标准>>> .NET 是 Microsoft XML Web services 平台.XML Web services 允许应用程序通过I ...

  4. .NET开发必看资料53个+经典源码77个

    目录0豆下载:http://down.51cto.com/data/426019 附件预览: 基于.net构架的留言板项目大全源码 http://down.51cto.com/zt/70 ASP.ne ...

  5. 前端开发必看 | Vue在前端市场这么火,它到底是什么?

    混迹前端市场的大家可能都知道,Vue可以说是一匹黑马,目前github star数已居第一位!前端开发者对Vue使用频率也越来越高. 作为由华人程序员尤雨溪开发的前端构架,它的出身给国人带来了巨大的荣 ...

  6. 【资料目录收藏】.NET开发必看资料53个+经典源码77个

    简单描述:为大家整理了下载中心.net资料,都是比较热的,好评率比较高的,做了一个可收藏的下载目录,希望大家喜欢~ 目录0豆下载: http://down.51cto.com/data/426019 ...

  7. Linux后台开发必看!

    来自:我是程序员小贱 一 自我介绍二 面试情况三 相关知识点汇总1 c/c++相关2 计算机网络3 数据结构相关4 数据库相关5 操作系统6 Linux基础知识及应用编程(后台必备!)7 大数问题8 ...

  8. 大厂面试都爱问这4个问题,.NET开发必看!

    金三银四已进入尾声,身边不少从事.NET开发的朋友有了更好的去处!大家日常在交流群里也常有分享经验.在面试时,大厂面试官都喜欢问什么:提问的形式和特点,大家又该如何应对等问题格外引起注意.今天就以腾讯 ...

  9. 互联网人必看的中台理论,阿里腾讯架构师用大白话讲出来了

    好久不讲中台了,最近看了一个梗: 中台和这个,两者有什么关系呢? 中台这个概念就是在2015年,被马老师以及阿里团队提出来的.在参观了一家游戏公司后,回来就在阿里整个集团层面启动了 "大中台 ...

最新文章

  1. python可以做什么工作好-Python入门后,想要从事自由职业可以做哪方面工作?
  2. GitLab 安装方法
  3. javafx属性_JavaFX技巧11:更新只读属性
  4. Odoo免费开源企业信息化平台助力企业成功
  5. obj是什么意思_为什么start方法会调用run方法?(为什么不能直接run来实现创建线程?)...
  6. 11gR2 Grid Infrastructure Installation prerequisites On LINUX
  7. 日期判断是今天/明天/后天
  8. vscode编程字体设置与修改
  9. 电子计算机一直在响,电脑硬盘一直响个不停怎么解决
  10. 深度学习方法(十五):知识蒸馏(Distilling the Knowledge in a Neural Network),在线蒸馏
  11. armbian ubuntu 桌面_armbian安装lxde桌面
  12. 计算给定字符串中最长回文子串的长度(或查找最长回文子串)
  13. zcu102_16_PL端读写DDR4
  14. (附源码)Springboot校园二手交易平台 毕业设计191637
  15. SAP MM 第一节 后台配置
  16. 复合材料专场 | ABAQUS车载四型复合材料气瓶固化过程的数值模拟分析攻略
  17. STM32F051——USART
  18. 网站攻击有几种?如何进行安全防护?
  19. oh-my-zsh(更强大的命令行工具)
  20. 用计算机控制ph,计算机控制实用技术

热门文章

  1. Copernicus Open Access Hub哥白尼开放中心
  2. make_unique的使用
  3. DF-GAN: A Simple and Effective Baseline for Text-to-Image Synthesis论文解读
  4. 文科生,你为啥学编程?
  5. IObit Uninstaller pro:完全卸载程序,自动清除残余及注册表
  6. sfc /scannow是什么意思,有什么作用?(转载)
  7. **视频会议设备连接注意事项**
  8. 【树链剖分】【模板】树的统计(P2590)
  9. 阿里云服务器 安装下载工具aira2步骤
  10. GUVV-T20GD-U 太阳光紫外线传感器TO-39U韩国GENICOM光电二极管杀菌灯监控