一、基本数据类型
Redis支持六种数据类型:string(字符串)、hash(哈希),list(列表),set(集合),zset(sorted set:有序集合),stream(5.0版本+)
不常见的类型:bitmap ,HyperLogLog(2.8.9版本+),Geo(3.2版本+)。
二、常见类型命令操作
1、string类型可以使用get、set、del、incr、decr等操作
数据结构是采用(Simple Dynamic String)SDS,而非C的字符串类型。
结构: typedef char *sds;
struct sdshdr {
// buf 已占用长度
int len;
// buf 剩余可用长度
int free;
// 实际保存字符串数据的地方
char buf[];
};
其存储数据结构决定计算长度的算法复杂度为O(1) ,另外在因为存在free的空间可以使得在字符串追加是减少内存重新分配的次数,二进制安全(不会产生内存溢出)。
分配策略,及触发时间,首次创建时free=0,当字符串变更时重新分配内存。
# 如果新字符串的总长度小于 SDS_MAX_PREALLOC (命令查看:)
# 那么为字符串分配 2 倍于所需长度的空间
# 否则就分配所需长度加上 SDS_MAX_PREALLOC 数量的空间
Java 操作方式:redisTemplate.opsForValue()** @see org.springframework.data.redis.core.ValueOperations
2、hash类型可以使用hmget、hmset、hgetall、hkeys等操作
其数据结构:字典结构,字典结构底层是通过简单,高效的哈希表实现。
结构:/*
* 字典
* 每个字典使用两个哈希表,用于实现渐进式 rehash
*/
typedef struct dict {
// 特定于类型的处理函数
dictType *type;
// 类型处理函数的私有数据
void *privdata;
// 哈希表(2 个 ht[0] ht[1])
dictht ht[2];
// 记录 rehash 进度的标志,值为 -1 表示 rehash 未进行
int rehashidx;
// 当前正在运作的安全迭代器数量
int iterators;
} dict;
/*
* 哈希表
*/
typedef struct dictht {
// 哈希表节点指针数组(俗称桶,bucket)
dictEntry **table;
// 指针数组的大小
unsigned long size;
// 指针数组的长度掩码,用于计算索引值
unsigned long sizemask;
// 哈希表现有的节点数量
unsigned long used;
} dictht;
/*
* 哈希表节点
*/
typedef struct dictEntry {
// 键
void *key;
// 值
union {
void *val;
uint64_t u64;
int64_t s64;
} v;
// 链往后继节点
struct dictEntry *next;
} dictEntry;
Redis 目前使用两种不同的哈希算法:
A:MurmurHash2 32 bit 算法:这种算法的分布率和速度都非常好, 具体信息请参考 MurmurHash 的主页: [http://code.google.com/p/smhasher/] 。
B: 基于 djb 算法实现的一个大小写无关散列算法:具体信息请参考 [http://www.cse.yorku.ca/~oz/hash.html] 。
使用哪种算法取决于具体应用所处理的数据:
命令表以及 Lua 脚本缓存都用到了算法 B。
算法A 的应用则更加广泛:数据库、集群、哈希键、阻塞操作等功能都用到了这个算法。
Java操作:redisTemplate.opsForHash()
3、list类型可以使用rpush、lpush、rpop、lpop等
底层结构:压缩链表或者双端链表
Java操作: redisTemplate.opsForList()
4、集合类型可以使用sadd、srem、scard、spop、smove登录
底层数据结构:字典
Java操作: redisTemplate.opsForSet()
5、有序集合可以使用zadd、zrem等
底层数据结构:跳跃表
Java操作: redisTemplate.opsForZSet()
三、java中redis常见连接工具
redisson,
jedis是redis官方推荐的
springboot的redisTemplate
等等
四、参考链接
[https://redisbook.readthedocs.io/]
[http://redisinaction.com/]
Redis系列(二)
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...