redis——string类型的设计与实现
2016-03-27 23:16
519 查看
Redis的string类型可以保存任何数据,包括图片、视频,是用二进制形式存储的
将其作为redis的默认字符串表示
例: 客户端设置字符串时
set name lzj
键值对的键是一个字符串对象,底层是保存着字符串"name"的SDS
键值对的值也是SDS,保存着"lzj"
struct sdshdr {
//记录buf数组已保存字符的个数
int len;
//标识buf数组中剩余的空间
int free;
//保存字符串的字节数组
char buf[];
}
SDS遵循C字符串以空字符结尾的惯例,保存空字符('\0')的1字节空间不包含在len里面
SDS的空间分配规则:
1.如果SDS修改后len小于1MB,则free变为修改后的len长度
即原来len==5,修改后len==10,则修改后 SDS = len(10) + free(10) + 1
2.如果SDS修改后len>=1MB,则每次扩展1MB
Redis String,无前缀,对于不存在的key都会创建指定的key | ||
命令 | 效果 | 备注 |
set key value | 设置对应的key和value | set name lzj |
get key | 获取对应key的value | get name |
setnx key value | 如果key已经存在,则不执行并返回0 | set if not exists |
setex key time value | 设置键值对并且设置有效期,单位为s | setex name 10 lzj |
setrange index str | 从指定下标开始替换字符(6则从第七个字符开始替换), 剩余的字符串不会被删除 | setrange name 0 L 把首字母大写 |
mset key1 value1 key2 value2 | 一次设置多个key的值,1√0×,会覆盖已经存在的key | mset name lzj sex man |
mget key1 key2 | 一次获取多个key的值 | mget name sex |
getset | 设置key的值,返回key的旧值 | gettest name |
getrange key start end | 获取子字符串 | getrange name 0 2 |
incr key | 对key的值做加加操作,并返回新的值 可以通过负数来实现减法 | incr age |
incrby | 添加指定的值 | incrb key 2 |
decr decrby | | |
append key value | 给指定key的字符串追加value,返回新字符串值的长度 | append name zzzz |
strlen key | 取指定key的value值的长度 | strlen name |
| |
redis中string的实现
redis自己构建了一种名为简单动态字符串(SDS , simple dunamic string)的抽象类型将其作为redis的默认字符串表示
例: 客户端设置字符串时
set name lzj
键值对的键是一个字符串对象,底层是保存着字符串"name"的SDS
键值对的值也是SDS,保存着"lzj"
SDS的定义
每个sds.h/sdshdr结构表示一个SDS值:struct sdshdr {
//记录buf数组已保存字符的个数
int len;
//标识buf数组中剩余的空间
int free;
//保存字符串的字节数组
char buf[];
}
SDS遵循C字符串以空字符结尾的惯例,保存空字符('\0')的1字节空间不包含在len里面
SDS的空间分配规则:
1.如果SDS修改后len小于1MB,则free变为修改后的len长度
即原来len==5,修改后len==10,则修改后 SDS = len(10) + free(10) + 1
2.如果SDS修改后len>=1MB,则每次扩展1MB
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- redis安装问题小结
- android上改变listView的选中颜色
- String.intern
- 使用 Redis 和 Python 构建一个共享单车的应用程序
- Redis偶发连接失败案例实战记录
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- Redis中实现查找某个值的范围
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- Redis和Memcached的区别详解
- 分割超大Redis数据库例子
- Redis总结笔记(一):安装和常用命令
- Redis sort 排序命令详解
- 用Redis实现微博关注关系
- redis中修改配置文件中的端口号 密码方法
- 在Ruby on Rails上使用Redis Store的方法
- PostgreSQL ERROR: invalid escape string 解决办法