redis字符串类型

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一秒钟内只能调用十次接口。伪代码如下

FUNCTION LIMIT_API_CALL(ip)
ts = CURRENT_UNIX_TIME()
keyname = ip+":"+ts
current = GET(keyname)

IF current != NULL AND current > 10 THEN
    ERROR "too many requests per second"
END

IF current == NULL THEN
    MULTI
        INCR(keyname, 1)
        EXPIRE(keyname, 1)
    EXEC
ELSE
    INCR(keyname, 1)
END

PERFORM_API_CALL()
set key value nx ex max-lock-time:set命令可以实现一个简单的锁。执行这个命令,返回ok表示获得锁,返回nil表示获取锁失败。

为了防止一个持有过期锁的客户端删除一个正在使用的锁,可以将key设为一个随机生成的值。同时在删除的时候验证客户端传来的字符串是否与键对应的值相等。一下是一个lua脚本

if redis.call("get",KEYS[1]) == ARGV[1]
then
    return redis.call("del",KEYS[1])
else
    return 0
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值