Redis 数据库
Redis 简介
REmote DIctionary Server(Redis)
是一个由Salvatore Sanfilippo写的key-value存储系统。是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是**字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)**等类型。
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持**字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs**等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
Redis键(key)
redis是通过key-value的形式进行数据的存储的
键命令
命令 | 描述 |
---|---|
keys pattern | 查找所有符合给定模式(pattern)的 key pattern可以是一个正则表达式 |
exists key | 检查给定 key 是否存在 |
type key | 返回 key 所储存的值的类型 |
del key | 该命令用于在 key 存在是删除 key(key 是一个确定的值) |
expire key seconds | 为给定 key 设置过期时间 |
ttl key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live) |
select dbindex | 切换数据库【0-15】,默认为0 |
dbsize | 查看当前数据库key的数量 |
flushdb | 清空当前库 |
flushall | 通杀全部库 |
Redis数据类型
字符串(String)
简介
String 是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
String 类型是二进制安全的。意思是Redis的String 可以包含任何数据。比如jpg图片或者序列化的对象 。
String 类型是Redis最基本的数据类型,一个键最大能存储512MB。
数据结构
Redis 使用标准 C 语言编写,但在存储字符时,Redis 并未使用 C 语言的字符类型,而是自定义了一个属于特殊结构 SDS(Simple Dynamic String)即简单动态字符串),这是一个可以修改的内部结构,非常类似于 Java 的 ArrayList。
String 采用了预先分配冗余空间的方式来减少内存的频繁分配(初始长度:假设字符串长度为n,初始长度是 n+25)。当字符串所占空间小于 1MB 时,Redis 对字符串存储空间的扩容是以成倍的方式增加的;而当所占空间超过 1MB 时,每次扩容只增加 1MB。Redis 字符串允许的最大值字节数是 512 MB。
struct sdshdr {
// 记录 buf 数组中已使用字节的数量
// 等于 SDS 所保存字符串的长度
unsigned int len;
// 记录 buf 数组中未使用字节的数量
unsigned int free;
// 字节数组,用于保存字符串
char buf[];
};
字符串命令
命令 | 描述 |
---|---|
set key value | 设置指定 key 的值 |
get key | 获取指定 key 的值 |
append | 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾 |
strlen | 获取值的长度 |
setex key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位) |
setnx key value | 只有在 key 不存在时设置 key 的值 |
incr key | 将 key 中储存的数字值增一 |
decr key | 将 key 中储存的数字值减一 |
incrby/decrby key step | 递增或者递减指定的大小 |
mset key value [key value …] | 同时设置一个或多个 key-value 对 |
msetnx key value [key value …] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
getrange key stat end | 返回 key 中字符串值的子字符 |
setrange key offset value | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始 |
getset key newValue | 将给定 key 的值设为 value ,并返回 key 的旧值(old value |
列表(List)
简介
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
Redis list(列表)相当于 Java 语言中的 LinkedList 结构,是一个链表而非数组,其插入、删除元素的时间复杂度为 O(1),但是查询速度欠佳,时间复杂度为 O(n)。
数据结构
Redis 列表的底层存储结构,其实是一个被称为快速链表(quicklist)的结构。当列表中存储的元素较少时,Redis 会使用一块连续的内存来存储这些元素,这个连续的结构被称为 ziplist(压缩列表),它将所有的元素紧挨着一起存储。
压缩列表是 Redis 为节省内存而开发的,它是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表了可以包含任意多个节点,每个节点都可以保存一个字符数组或者整数值。
而当数据量较大时,Redis 列表就会是用 quicklist(快速链表)存储元素。Redis 之所以采用两种方法相结合的方式来存储元素。这是因为单独使用普通链表存储元素时,所需的空间较大,会造成存储空间的浪费。因此采用了链表和压缩列表相结合的方式,也就是 quicklist + ziplist,结构如下图:
如图,将多个 ziplist 使用双向指针串联起来,这样既能满足快速插入、删除的特性,又节省了一部分存储空间。
列表命令
命令 | 描述 |
---|---|
lpush/rpush key value1 value2 … | lpush 将一个或多个值插入到列表头部 rpush 在列表中添加一个或多个值 |
lrange key start end | 获取列表指定范围内的元素 从零开始,-1表示最后一个,-2 倒数第二个,以此类推 |
lpop/rpop key | lpop 移出并获取列表的第一个元素 rpop 移除并获取列表最后一个元素 |
rpoplpush k1 k2 | 移除列表k1的最后一个元素,并将该元素添加到列表k2并返回k1的最后一个元素 |
lindex key index | 通过索引获取列表中的元素 |
llen key | 获取列表长度 |
linsert key before|after pivot value | 在列表的元素前或者后插入元素 |
lrem key count value | 移除列表元素 |
lset key index value | 通过索引设置列表元素的值 |
lset key index value | 通过索引设置列表元素的值 |