1.字符串类型简介
字符串类型是redis是最基本的数据类型。也是其他数据类型的基础。字符串类型可以存储,字符串,json化对象甚至是图片。
2.字符串在redis中的存储结构
每一个字符串在redis中都是对应编码的二进制代码。例如ivy:[‘01101001’,‘01110110’,'01111001']。
每种类型在redis中对应一种或者两种存储结构(可以通过设置切换不同的内部存储结构以下简称redis结构)。
字符串类型redis结构
sds (simple dynamic string):是redis中最底层最基础的类型。所有类型都是基于sds实现的。
sdshdr:和sds类似,但是比sds结构多了两个记录实际使用和剩余空间的变量。以下说明中sdshdr等同于sds
字符串类型在redis中使用以下结构保存
struct sdshdr{
int len;//字符串实际长度
int free;//字符串中剩余可用长度
char buf[];//实际保存字符串的内存空间,类似于一个sds
}
redis新增一个sdshdr会自动分配SDS_MAX_PREALLOC(1024*1024)字节空间。如果实际存储的字符串需要空间大于SDS_MAX_PREALLOC,那么会自动追加一个SDS_MAX_PREALLOC空间。如果实际需要小鱼SDS_MAX_PREALLOC,那就分配两倍SDS_MAX_PREALLOC空间。
redis中一个键只能对应一个值,一个值却可以被多个键引用。所以redis在初始化的时候就会创建0-9999这些字符串作为共享对象。所以说,0-9999字符串在redis中不占空间。
3.应用举例
append:append key value 向key对应的值后面追加value值。如果key存在就追加,如果key不存在就创建。返回key对应字符串的实际值。
append可以为一系列定长数据提供紧凑的表示方式。我们称之为时间序列。
例如全世界的汽车品牌按照知名度编码,奔驰:0001 宝马0002 奥迪0003
他们的编码长度是一样的。那么就可以使用一个字符串去存储所有的汽车品牌。
bitcount:计算字符串中1的数量。
该操作可以很方便的统计员工打卡次数。例如,用一个字符串存储员工是否打卡,0没有打卡,1打卡。可以这么做
这样就可以很方便的统计员工打卡次数。
getset:getset key value 将key设值为value并返回key的原值。
该命令可以在一个原子时间内将计数器清零并返回计数器的值。例如用户每次输入错误的密码就将计数器加一,成功登录就将计数器清零。
incr key:如果key不存在就创建key并初始化为0.如果存在就增加一。
这个命令可以实现一个非常常用的访问限制器功能。例如限制一个ip一秒钟内只能调用十次接口。伪代码如下
set key value nx ex max-lock-time:set命令可以实现一个简单的锁。执行这个命令,返回ok表示获得锁,返回nil表示获取锁失败。
为了防止一个持有过期锁的客户端删除一个正在使用的锁,可以将key设为一个随机生成的值。同时在删除的时候验证客户端传来的字符串是否与键对应的值相等。一下是一个lua脚本