字符串是 Redis 中最常用的数据结构。字符串类型的值,简单字符串,JSON , XML,数字,二进制(图片等),最大 512MB 大小。
基本命令
设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
ex 为键设置秒级过期时间
px 为键设置毫秒级过期时间
nx 键必须不存在,才可以设置成功,添加时使用
xx 键必须存在,才能设置成功,更新时使用
setex
与 set 的 ex 选项一样,设置失效时间。
setex key seconds value
setnx
与 set 的 nx 选项一样。
setnx key value
redis 是单线程命令处理机制,如果多个客户端同时执行 setnx 某个 key 的指令,只能有一个客户端设置成功。setnx 可以作为分布式锁的一种实现方案。
获取值
get key
如:
localhost:6379> get hello
"world"
如果键不存在返回 nil。
批量set/get
批量操作可以提高效率。由于 Redis 的执行命令时间已经足够高,但是网络请求的时间需要考虑,批量操作能够减少网络请求次数从而提高效率。
mset key value [key value ...]
mget key [key ...]
如
localhost:6379> mset a 1 b 2 c 3 d 4
OK
localhost:6379> mget a b c d
1) "1"
2) "2"
3) "3"
4) "4"
计数
incr key
对 key 对应的 value 的整数进行自增操作。如果不是整数,返回错误。如果是整数,返回自增结果。如果键不存在,按照 0 自增,返回结果是 1。
localhost:6379> exists key
(integer) 0
localhost:6379> incr key
(integer) 1
另外,还有 decr(自减),incrby(自增指定数字),decrby(自减指定数字),incrbyfloat(自增浮点数)等。
自增操作,在其他要考虑并发的系统或语言中,都会使用 CAS 原子机制来计数。但是 Redis 中因为是单线程架构,任何命令都要进行排队进行顺序执行,不需要考虑并发的问题。
内部编码
redis 会根据当前值的类型和长度来决定使用哪种内部编码实现。
字符串内部编码:
- int 8个字节的长整型。
- embstr 小于等于39个字节的字符串。
- raw 大于39个字节的字符串。
整数类型
localhost:6379> set str 999
OK
localhost:6379> object encoding str
"int"
短字符串
localhost:6379> set str hello
OK
localhost:6379> object encoding str
"embstr"
长字符串
localhost:6379> set longstr aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OK
localhost:6379> object encoding longstr
"raw"
使用场景
缓存
在 Web 服务中,对用户的信息存储在 Mysql 中,使用 Redis 来缓存。大部分数据都由 Redis 中获取,降低 Mysql 的访问压力。
如果从 Redis 中没有获取到用户信息,那么需要从 Mysql 中获取,然后将结果写入 Redis 中,并可以添加一个过期时间。
计数
Redis 可以实现快速计数,查询缓存的功能。比如用户每次播放一次视频,相应的视频播放次数就自增1。
共享Session
分布式的 Web 服务会将用户的 Session 信息保存在各自的服务器中,但是由于负载均衡可能会将用户的请求均衡到不同的服务器,结果可能造成需要重新验证登陆的情况。
这种情况可以使用 Redis 来解决,将用户的 Session 使用 Redis 来进行集中管理。用户每次更新或者查询登陆都从 Redis 中来获取。
限速
某个 IP 禁止多次访问的话,可以通过在 Redis 中设置 IP 对应的键以及过期时间,此时间段中如果还有该 IP 的访问,经过 Redis 查询到存在,那么就进行对应的限制即可。