文章目录
- 0.概述
- 0.1Redis数据类型 中文官网 (不推荐,更新不及时)
- 0.2.Redis数据类型 英文官网 (推荐)
- 0.3.key的最大大小:512M
- 0.4.value的最大大小:512M
- 0.5.可以存储的数据类型:字符串,整数,浮点型
- 1.2.4.1.设置10s后过期:set key value ex 10
- 1.2.4.2.单独设置过期时间10s:EXPIRE name11 10
- 1.2.4.3.如果不存在的时候,设置key的值并且过期时间为10s:set name12 gaoxinfu12 ex 10 nx
- 1.2.4.4.只有key存在的时候,设置key的值并且过期时间为10s:set name13 gaoxinfu13_new ex 10 xx
- 1.2.5.1.设置值为数值:set frank_age 18
- 1.2.5.2.减少1:dec frank_age
- 1.2.5.3.增加1:incr frank_age
- 1.2.5.4.增加n:incrby frank_age 10
- 1.2.5.5.减少n:DECRBY frank_age 2
- 1.2.7.追加内容:APPEND name2 frank
- 1.2.8.获取字符串指定位置内容:getrange name2 9 14
- 1.2.9.其他命令参考:http://redisdoc.com/string/index.html
- 2.源码
- 2.2.2.1.int类型:存储 8 个字节的长整型(long,2^63-1)
- 2.2.2.2.embstr类型:代表embstr 格式的SDS(Simple Dynamic String 简单动态字符串), 存储小于 44 个字节的字符串
- 2.2.2.3.raw类型:代表raw 格式的SDS,存储大于 44 个字节的字符串(3.2 版本之前是 39 字节)
- 2.3.1.len:字符串长度
- 2.3.2.alloc:分配的内存空间
- 2.3.3.flags:sds类型(sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64)
- 2.3.4.buf:数据内容(C语言中使用字符数组)
- 4.1.1.C语言Char[]类型必须去提前分配数组的大小,意味着必须存储足够大的空间,否则会溢出;
- 4.1.2.如果获取数组长度,必须遍历字符数据,时间复杂度O(n)
- 4.1.3.C语言 对于字符串的变更会对字符数组进行内存的重新分配
- 4.1.4.通过从字符串开始到结尾碰到的第一个'\0'来标记字符串的结束,因此不能保存图片、音频、视频、压缩文件等二进制(bytes)保存的内容,二进制不安全
- 4.2.1.不用担心内存溢出问题,如果需要会对SDS 进行扩容
- 4.2.2.获取字符串长度时间复杂度为O(1),因为定义了len 属性
- 4.2.3.通过“空间预分配”( sdsMakeRoomFor)和“惰性空间释放”,防止多次重分配内存
- 4.2.4.判断是否结束的标志是len 属性(它同样以'\0'结尾是因为这样就可以使用C语言函数库操作字符串的函数)
- 5.1.热点数据的存储
- 5.2.数据共享缓存<----分布式
- 5.3.分布式锁<----setnx方法:大家可以设置失效时间
- 5.4.全局唯一的Id(原子性):分库分表主键
- 5.5.计数器:如微博点赞数量,或者抽奖数量,文章的阅读数量
- 5.6.限流:客户访问次数限制等 incr
0.概述
0.1Redis数据类型 中文官网 (不推荐,更新不及时)
http://www.redis.cn/topics/data-types-intro
0.2.Redis数据类型 英文官网 (推荐)
https://redis.io/topics/data-types-intro
0.3.key的最大大小:512M
0.4.value的最大大小:512M
0.5.可以存储的数据类型:字符串,整数,浮点型
1.String 字符串类型的相关命令
1.2.简单的赋值:set key1 value1
1.2.1.格式
1.2.2.批量操作
1.2.2.1.批量赋值:mset key2 value2 key3 value3
1.2.2.3.批量取值:mget name2 name3
1.2.3.如果key不存在,则设置key的值为value:setnx key value
1.2.3.2.设置失败返回:0
由于key:gaoxinfu_age前面已经存在,所以设置的时候没成功,返回了0
1.2.3.2.设置成功返回:1
新创建的key:frank_age 设置成功
1.2.3.3.总结:setnx可以用来作为分布式锁,进行资源的竞争,设置成功即为获得锁;
1.2.4.删除key(这个可以作为释放锁的命令):del frank_age
1.2.4.1.设置10s后过期:set key value ex 10
设置10s后过期
10s后去查询,已经不存在
1.2.4.2.单独设置过期时间10s:EXPIRE name11 10
1.2.4.3.如果不存在的时候,设置key的值并且过期时间为10s:set name12 gaoxinfu12 ex 10 nx
10s后再次查询,已经不存在
1.2.4.4.只有key存在的时候,设置key的值并且过期时间为10s:set name13 gaoxinfu13_new ex 10 xx
1.2.5.value为数值类型的操作
1.2.5.1.设置值为数值:set frank_age 18
1.2.5.2.减少1:dec frank_age
1.2.5.3.增加1:incr frank_age
1.2.5.4.增加n:incrby frank_age 10
1.2.5.5.减少n:DECRBY frank_age 2
1.2.6.value为浮点类型的操作
1.2.6.1.增加n:incrbyfloat salary 8.4
1.2.6.2.减少n:incrbyfloat salary 8.4
1.2.7.追加内容:APPEND name2 frank
1.2.8.获取字符串指定位置内容:getrange name2 9 14
1.2.9.其他命令参考:http://redisdoc.com/string/index.html
http://redisdoc.com/string/index.html
2.源码
2.1.dictEntry数据结构-源码
2.2.redisObject数据结构-源码
2.2.1.type :指的是我们客户端调用存储的数据类型
2.2.2.encoding:字符串在redis中的字符编码类型(主要是根据存储值的大小去划分)
2.2.2.1.int类型:存储 8 个字节的长整型(long,2^63-1)
2.2.2.2.embstr类型:代表embstr 格式的SDS(Simple Dynamic String 简单动态字符串), 存储小于 44 个字节的字符串
2.2.2.3.raw类型:代表raw 格式的SDS,存储大于 44 个字节的字符串(3.2 版本之前是 39 字节)
2.2.3.lru :垃圾回收的策略:
2.2.3.1.lru:Least Recently Used 最近最久未使用算法
2.2.3.2.lfu Frequently Used :最小频率未使用算法
2.2.4.refcount:被引用次数(如果为0,标示没有对象在引用,可以被回收)
2.2.5.*ptr:真正的value数据存储结构的地址
2.3.SDS数据结构-源码:(sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64)
2.3.1.len:字符串长度
2.3.2.alloc:分配的内存空间
2.3.3.flags:sds类型(sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64)
2.3.4.buf:数据内容(C语言中使用字符数组)
3.为什么我们说redis String类型是二进制安全的?
4.为什么Redis用SDS实现字符串的存储?为啥不直接用C语言中的Char[]数组呢?
4.1.首先,C语言本身是没有字符串这种数据类型,而是通过Char[]数组存储,但是Char[]存储存在下面问题?
4.1.1.C语言Char[]类型必须去提前分配数组的大小,意味着必须存储足够大的空间,否则会溢出;
4.1.2.如果获取数组长度,必须遍历字符数据,时间复杂度O(n)
4.1.3.C语言 对于字符串的变更会对字符数组进行内存的重新分配
4.1.4.通过从字符串开始到结尾碰到的第一个’\0’来标记字符串的结束,因此不能保存图片、音频、视频、压缩文件等二进制(bytes)保存的内容,二进制不安全
4.2.使用SDS存储的优势
4.2.1.不用担心内存溢出问题,如果需要会对SDS 进行扩容
4.2.2.获取字符串长度时间复杂度为O(1),因为定义了len 属性
4.2.3.通过“空间预分配”( sdsMakeRoomFor)和“惰性空间释放”,防止多次重分配内存
4.2.4.判断是否结束的标志是len 属性(它同样以’\0’结尾是因为这样就可以使用C语言函数库操作字符串的函数)
5.String字符串类型应用场景
5.1.热点数据的存储
5.2.数据共享缓存<----分布式
5.3.分布式锁<----setnx方法:大家可以设置失效时间
http://redisdoc.com/string/set.html
5.4.全局唯一的Id(原子性):分库分表主键
5.5.计数器:如微博点赞数量,或者抽奖数量,文章的阅读数量
5.6.限流:客户访问次数限制等 incr
6.关于SDS的概念的学习,可以参考下面的地址