数据结构
Redis无论什么数据类型,存储的时候都是以键值对key-value形势存储,并且所有的key都是String类型,本文讨论的数据类型是value的数据类型。
String类型
概述:String类型是Redis最基本最常用的数据类型,是键值对key-value的结构,为了方便理解,可以类比Java中的map结构,通过key去找到value,String类型是数据安全的,可以存储各种类型的数据,String类型的最大存储不能超过512MB。
String常用命令:
命令 | 描述 |
---|---|
set key value | 将key的值设置为value,key存在则覆盖,成功返回1,失败返回0 |
get key | 根据key获取value值 |
setnx key value | key不存在的时候设置值,key存在则无法设置 |
mset k1 v1 k2 v2… | 批量设置多个键值对key value |
mget k1 k2 | 批量获取多个key 的value |
del key | 通过key删除键值对 |
incr key | 将key值增加1 |
decr key | 将key值增减1 |
incrby key increment | 将key的value值增加increment |
decrby key increment | 将key的value值减少increment |
strlen key | 获取key的value的长度 |
append key value | 将value追加到key的燕来值的后面 |
注意:incr、decr、incrby 、decrby等命令只支持整数和浮点数操作。
Sting类型的底层数据结构:
String类型的底层实现是动态字符串SDS(simple dynamic string),动态字符串由长度、空闲空间和字节数组三部分组成。
SDS底层实现:
struct sdshdr{
int len;
int free;
char buf[];
}
- len:记录动态字符串的实际使用长度,也就是当前保存字符串的长度。
- free:记录当前字节数据未使用字节空间。
- buf[]:字节数组,用来保存字符串。
为什么存在free?
因为Redis是使用C语言实现的,C语言中空间分配是一个开销比较大的操作,Redis作为一个高性能的缓存数据库,对于性能要求十分高, 且会有频繁的修改操作,如果每次修改修改字符串都要重新分配内存,这样会对性能影响很大,那我们多出一块空间,就会省掉内存重新分配的工作,这就是free存在的意义,也叫空间预分配。
SDS的编码类型?
- int:存储整数类型的数据,占用8个字节。
- raw:存储大于44 Byte的字符串(Redis 3.2版本以前是39 Byte)。
- embstr:存储小于于44 Byte的字符串(Redis 3.2版本以前是39 Byte),但其占用空间是64 Byte。
String应用场景:
- 缓存各类数据(虽说是缓存各类数据,但是Redis是内存数据库,内存宝贵,要合理进行缓存)。
- 实现共享session。
- 分布式全局id,incr、decr命令来实现。
- 计数器,统计点赞数,网站访问数等,incr、decr命令来实现。
如有不正确的地方请各位指出纠正。