Redis 所有的 key 都是字符串,value 的类型是存在差异的
Redis 中的字符串,是直接按照二进制数据的方式存储(不会做任何的编码转换)
mysql 的默认字符集是 拉丁文,插入中文会失败
常见命令
1)set
将 string 类型的 value 设置到 key 中。若 key 存在则覆盖原来的值,之前的 key 设置的 ttl 也失效
set key value [expiration EX seconds | PX milliseconds] [NX | XX]
如果设置成功,返回 OK如果由于 SET 指定了 NX 或者 XX 但条件不满足,SET 不会执行,并返回 (nil)O(1)
setnx key value
当 key 不存在时,设置 key-value
返回 1 表示设置成功, 0 表示设置失败 O(1)

flushall 可以删除 redis 上所有的键值对(相当于MySQL中的删库)
2)get
只支持字符串类型的 value,如果类型不对,会报错
get key
获取 key 对应的 value,如果 key 不存在,返回 nil O(1)
3)mset mget
一次设置/获得多个 key 的值
mset key [key ...]
返回值是OK O(N) N是 key 的数量
mget key [key ...]
返回值是对应的 value 列表 O(N) N是 key 的数量
批量操作可以减少网络时间,但执行时间过长会造成阻塞
4)incr decr
将 key 对应的 string 表示得数字加一
如果 key 不存在,视 key 对应的 value 是 0 。若不是一个整形或超过64位有符号整形,则报错
incr key
返回 Integer 类型加一后的值 O(1)
incrby key decrement(可以是负数)
返回 Integer 类型加后的值 O(1)
decr key
decrby key decrement(可以是负数)
incrbyfloat key decrement(可以是负数)
由于 Redis 处理命令是单线程模型。多个客户端同时针对同一个 key 进行加减操作,不会引起“线程安全”问题
5)append
如果 key 存在并且是一个 string,将 value 加到原有 string 的后边。如果 key 不存在,等同于 set
append key value
返回加完后的 string 的长度(字节) O(1)
Redis 的字符串,不会对字符编码做任何处理(Redis 只认识字节)
6)getrange setrange
返回 key 对应的 string 子串(左闭右闭)负数表示倒数
超过范围的偏移量会尽量根据 string 的长度调整成正确的值
getrange key start end
返回 string 类型的子串 O(N)(N 字符串长度)
setrange key offset value
返回替换后的 string 的长度 O(N)(N 字符串长度)
setrange 对不存在的 key 操作,会把 offset 之前的内容填充成 0x00
7)strlen
获取 key 对应的 string 的长度。当 key 对应的 value 不是 string 时报错
strlen key
返回 string 的长度 O(1)
1)c++ 中,字符串的长度是以字节为单位
2)java 中,字符串的长度是以字符为单位
char 使用 unicode,一个汉字使用两个字节
string 使用 utf8,一个汉字使用三个字节
3)MySQL 中,varchar(N) N的单位也是字符
编码方式
string 内部的编码方式有三种:
1. int 64位/8字节 的整数
2. embstr 压缩字符串,适用于比较短的字符串
3.raw 普通字符串,适用于比较长的字符串,只是单纯的持有字节数组
Redis 存储小数,本质上还是存储字符串(每次进行算术运算,需要先把字符串转成小数)
整数直接用 int 存储(c++ long long Java long
应用场景
1)缓存(Cache)
Redis 作为缓冲层,MySQL 作为存储层,绝大多数的数据都从 Redis 获取
Redis 具有支撑高并发的特性,缓存通常能加速读写和降低后端压力
应用服务器访问数据时,先查询 Redis
如果 Redis 上数据存在,直接从 Redis 上读取数据交给服务器,不访问数据库
如果 Redis 上数据不存在,读取MySQl,把读取到的结果返回给应用服务器。同时,把这个数据写入到 Redis
Redis 这样的缓存,经常用来存储“热点”数据
但是上述的策略存在一个明显的问题:
随着时间的推移,会有越来越多的数据在 Redis 从上查询不到,从而从MySQL读取并写入到Redis,Redis 存储的数据会越来越多 ——>
1)把数据写给 Redis 的同时,给 key 设置一个过期时间
2)Redis 也在内存不足的时候,提供了淘汰策略
2)计数功能
Redis 并不擅长数据统计
Redis 记录数据的变化,以异步(并非一个请求就写一个数据)的方式将数据同步到其他数据源
3)共享会话
会话:客户端与服务器交互过程中,产生的一些专属于该客户端的中间状态的数据
⼀个分布式 Web 服务将用户的 Session 信息(例如用户登录信息)保存在各自服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同⼀台服务器上,这样当用户刷新⼀次访问是可能会发现需要重新登录,这个问题是用户无法容忍的


4)验证码
业务是一个公司/产品,是如何解决一个/一系列问题的过程