Redis常用

基础入门教程

中文官方文档

数据结构常见的应用方式

Redis Strings 字符串

值最大不能超过 512MB

字符串类型对应常用命令

业务不经常变更的数据,接口响应的json字符串等

图片的base64的值

数值秒杀数量之类的,INCR , INCRBYDECR , DECRBY 命令(内部就是同一个命令,只是看上去有点儿不同)会将字符串解析成整数进行原子操作。原子操作意味着多个客户端对同一个key发出INCR命令,也决不会导致竞争的情况。

统计数据,每小时更新访客信息计数器,GETSET可以和INCR一起使用实现支持重置的计数功能

redis> INCR mycounter //访问
(integer) 1
redis> GETSET mycounter "0" //获取并重置计数
"1"
redis> GET mycounter //获取重置后的数据
"0"
redis> 

为减少等待时间,也可以一次存储或获取多个key对应的值,使用MSETMGET命令

> mset a 10 b 20 c 30
OK
> mget a b c //返回由值组成的数组
1) "10"
2) "20"
3) "30"

Redis Hash 哈希

hash (散列) 指令的完整列表

特别适合用于存储对象,Redis 中每个 hash (散列) 可以存储 232 – 1 键值对(40多亿)

系统参数常量配置功能

Redis Lists 列表

list常用命令

简单的消息队列

lpoprpush(或者反过来,lpushrpop)能实现队列的功能,BLPOP,BRPUSH阻塞式实现消息队列。

朋友圈的点赞列表、评论列表、排行榜:lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表。

限速器,可用于限制某个用户访问某个接口的频率,比如秒杀场景用于防止用户快速点击带来不必要的压力

好友关系,利用集合的一些命令,比如交集、并集、差集等,实现共同好友、共同爱好之类的功能

Redis Set 集合

 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis Sorted Set 有序集合

 string 类型元素的集合,且不允许重复的成员,每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

发布/订阅

Redis 发布订阅简单教程

Pub/Sub发布订阅中文文档

redis实现消息队列(轻量级)的方案

消息队列的考验:Redis有哪些解决方案?

消息队列特征 基于List 基于streams 基于发布订阅
消息保序适用LPUSH/RPOP使用ADD/XREAD
阻塞读取适用BRPOP使用XREAD block
重复消息处理生产者自行实现全局唯一IDStreams自动生成全局唯一ID
消息可靠性适用BRPOP LPUSH使用PENDING List自动留存消息,使用XPENDING查看,使用XACK确认消息
适用场景Redis5.0之前版本的部署环境消息总量少Redis5.0及以后的版本的部署环境消息总量大,需要消费组形式读取数据

缓存使用常见问题

如何保证双写一致性

Cache Aside Pattern 模式

读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。

更新的时候,先更新数据库,然后再删除缓存。删除缓存而不更新缓存的原因:有些需要进行复杂计算或查询的缓存场景,更新的操作成本太高。

不一致场景及解决方案

先删除缓存再更新数据库

进行更新操作时,先删除缓存,然后更新数据库,后续的请求再次读取时,会从数据库读取后再将新数据更新到缓存

先更新数据库再删除缓存

进行更新操作时,先更新 MySQL,成功之后,删除缓存,后续读取请求时再将新数据回写缓存。

存在的问题:更新 MySQL 和删除缓存这段时间内,请求读取的还是缓存的旧数据,不过等数据库更新完成,就会恢复一致,影响相对比较小。

异步更新缓存

数据库的更新操作完成后不直接操作缓存,而是把这个操作命令封装成消息扔到消息队列中,然后由 Redis 自己去消费更新数据,消息队列可以保证数据操作顺序一致性,确保缓存系统的数据正常。

Redis 缓存击穿、穿透、雪崩

相关文章和面试问题

Redis必知必会20问

如何保证缓存(redis)与数据库的双写一致性

缓存一致性,缓存穿透,缓存击穿,缓存雪崩解决方案分析

PHP+Redis 有序集合实现 24 小时排行榜实时更新

redis的五种数据结构和应用场景【如微博微信点赞/共同关注/加购物车】

真实项目中应用案例记录

REDIS配置详解





Redis必须是以文件路径作为第一个参数开始
redis-server /path/to/redis.conf

需要内存大小时,可以指定通常以1k 5GB 4M的形式出现,以此类推:
1k => 1000字节
1kb => 1024字节
1m => 1000000字节
1mb => 1024 * 1024字节
1g => 1000000000字节
1gb => 1024 * 1024 * 1024字节
单位不区分大小写,因此1GB 1Gb 1gB都是相同的

==INCLUDES==========================================================
在此处包含一个或多个其他配置文件。如果你这很有用有一个标准模板,可以转到所有Redis服务器,但也需要自定义一些每服务器设置。包含文件可以包括the other files,所以明智地使用它。
通知选项“include”不会被命令“CONFIG REWRITE”重写
来自admin或Redis Sentinel。由于Redis总是使用最后一次处理line作为配置指令的值,你最好把include包括在内在此文件的开头,以避免在运行时覆盖配置更改。
include /path/to/local.conf
include /path/to/other.conf

==MODULES===========================================================启动时加载模块。
如果服务器无法加载模块它会中止。可以使用多个loadmodule指令。
loadmodule /path/to/my_module.so
loadmodule /path/to/other_module.so

==NETWORK==========================================================
如果未指定“bind”配置指令,则Redis将监听来自服务器上所有可用ip的连接。可以使用只听一个或多个选定的ip
bind 192.168.1.100 10.0.0.1 
bind 127.0.0.1 ::1
bind 0.0.0.0 监听所有
port 6379 监听端口

 
默认情况下启用保护模式。
只有当您确定希望其他主机的客户端连接到Redis 时,即使未配置任何身份验证,也不应使用“bind”指令明确列出特定的接口您应该禁用它.
开启远程访问需要将此选择项改为no
protected-mode yes

此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。
tcp-backlog 511

Unix socket.
指定以redis unix socket方式运行的
unixsocket /tmp/redis.sock //路径
unixsocketperm 700 //权限建议 777


客户端空闲超时时间,0表示禁用
timeout 0


tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。
tcp-keepalive 300


daemonize是用来指定redis是否要用守护线程的方式启动。 
daemonize 设置yes或者no区别
daemonize:yes:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no: 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出
daemonize yes


是否通过upstart或systemd管理守护进程。默认no没有服务监控,可选项有no ,upstart, systemd, auto
supervised no

pid文件在redis启动时创建,退出时删除。最佳实践为配置该项。
pidfile /var/run/redis_6379.pid

#配置日志级别。选项有debug, verbose, notice, warning
loglevel notice

日志名称。空字符串表示标准输出。注意如果redis配置为后台进程,标准输出中信息会发送到/dev/null
logfile /usr/local/redis/var/redis.log

是否启动系统日志记录。
syslog-enabled no

指定系统日志身份。
syslog-ident redis

指定syslog设备。必须是user或LOCAL0 ~ LOCAL7之一。
syslog-facility local0


设置数据库个数。默认数据库是 DB 0
可以通过SELECT where dbid is a number between 0 and 'databases'-1为每个连接使用不同的数据库。
databases 16