数据类型初识
作为 Key-value 型数据库,Redis 也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串,Redis 的键值还可以是以下形式之一:
Lists (列表)
Sets (集合)
Sorted sets (有序集合)
Hashes (哈希表)
适用场景
- 取最新的n个数据,如读取作家博客最新的50篇文章,通过List实现按时间排序的数据的高效获取
- 排行榜应用,以特定条件为排序标准,将其设成sorted set 的score,进而实现高效获取
- 需要精准设定过期时间的应用,把sorted set 的 score 值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了
- 计数器应用,Redis 的命令都是原子性的,可以轻松地利用 INCR,DECR 命令来构建计数器系统。
- 去除大量数据中的重复数据,将数据放入set中,就能实现对重复数据的排除
- 构建队列系统使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队列系统。
- 实时系统,反垃圾系统通过上面说到的 set 功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。
- Pub/Sub构建实时消息系统
- 缓存
redis数据类型及操作详解
1. strings类型及操作
- string 本质是个 byte 数组,可以包含任何数据,是二进制安全的。
二进制安全功能本质上是把输入当作一个没有任何特殊的原生流,其在操作上应包含一个字符所能有的256种可能的值(假设为8为字符)。
- c语言定义:
struct sdshdr {
long len;//buf数组的长度
long free;//数组中剩余的可用字节
char buf[]; //存储字符
};
- 操作方法:
命令 | 介绍 |
set [key] [value] | 设置值 |
setnx [key] [value] | 如果key存在,返回0并不生效修改 |
setex [key] [time] [value] | 指定有效期为time秒 |
setrange [key] n [string] | 将key对应value第n位后面的字符替换成string |
mset [key1] [value1] [key2] [value2] …… | 一次设置多个值 |
msetnx | 类似setnx,设置多个值,,如果key存在,则返回0且修改不生效 |
get [key] | 获取key对应的值 |
getset [key] [value] | 设置key的值,并返回key的旧值 |
getrange [key] n1 n2 | 获取key对应值的索引位置从n1到n2的字符串 |
mget [key1] [key2] [key3]…… | 一次获取多个key对应的值,如果不存在,则返回nil |
incr [key] | 对key的值作加1操作,如果incr一个不存在的值,则对q赋值为1,如果key对应值不是int型则返回错误: |
incrby [key] [num] | 加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0 |
decr [key] | 对key的值做的是减1操作,decr 一个不存在 key,则设置 key 为-1 |
decrby [key] | [num] 对key对应的value-num |
append [key] | [string] 将string追加到key对应的值尾,返回新字符串的长度 |
strlen [key] | 读取key对应value的长度 |
2. hashes类型及操作
- Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,相较string,由于使用了zipmap而占用更少的内存
- 操作方法:
命令 | 介绍 |
hset [object] [field] [value] | 给object添加属性 |
hsetnx | 类似hset,如果field已存在,则返回0且修改不生效 |
hmset [object] [field1] [value1] [field2] [value2]…… | 同时设置多个值 |
hget [object] [field] | 获取对象对应属性的值 |
hmget [object] [field1] [field2] | 获取多个值 |
hincrby [object] [field] | num 给field对应值 + num |
hexists [object] [field] | 判断特定对象指定fiels是否存在 |
hlen [object] | 返回对象属性数量 |
hdel [object] [field] | 删除object对应field |
hkeys [object] | 返回对象所有field |
hvals [object] | 返回对象所有field对应的value |
hgetall [object] | 返回对象所有field和value |
3. list类型及操作
- list 底层实现是一个双向链表,最大长度为2^32,也可用作栈
- 操作方法:
命令 | 介绍 |
lpush/rpush [list] [value] | 从头/尾部向list添加值,返回list长度 |
lrange/ [list] start end | 返回list对应索引区间的值 |
linsert [list] [before/after] ‘value1’ ‘value2’ | 在list的value1的前面/后面插入value2 |
lset [list] index ‘value’ | 在特定索引插入value,注意:如果index为负值,则从list尾部开始算起 |
lrem [list] num ‘value’ | 从list中删除num个和value相同的值,若num>0,则从链头算起,若<0则从链尾算起,若=0则删除全部 |
ltrim [list] start end | 仅保留list中索引从start到end的值 |
lpop [list] | 从头部删除元素,同时返回该元素 |
rpop [list] | 从尾部删除元素并返回 |
rpoplpush [list1] [list2] | 从list1的尾部移除元素并添加到list2的头部,最后返回被移除的元素值,整个操作是原子的.如果list1是空或者不存在返回 nil |
lindex [list] | index 返回list中index索引位置的元素 |
llen [list] | 返回list的长度 |
4. set类型及操作
- 是 string 类型的无序集合。set 元素最大可以包含(2 的 32 次方)个元素。set 的是通过 hash table 实现的,hash table 会随着添加或者删除自动的调整大小。调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作。
- 操作方法:
命令 | 介绍 |
smembers [set] | 查看set中的元素 |
sadd [set] [value] | 像set中插入value,成功插入返回1,插入set中已有的value则失败且返回0 |
srem [set] [value] | 删除set中对应的value,删除成功返回1,若不存在则返回0 |
spop [set] | 随机删除并返回set中的元素 |
sdiff [set1] [set2] | 删除set1中在set2里也存在的元素,返回删除操作后的set1 |
sdiffstore [set1] [set2] [set3] | 将sdiff [set2] [set3] 的结果保存在set1中 |
sinter [set1] [set2] | 返回set1 set2共有元素 |
sinterstore [set1] [set2] [set3] | 将sinter [set2] [set3] 结果保存在set1中 |
sunion [set1] [set2] | 返回[set1] [set2]的并集 |
sunionstore [set1] [set2] [set3] | 将[set2] [set3]的并集保存在[set1]中 |
smove [set1] [set2] [value] | 将[set1] 的value移动到set2中,若value存在于set1,无论set2是否已存在,都(成功)返回1,不存在于set1则(失败)返回0 |
scard [set] | 返回set中的元素个数 |
sismember [set] [value] | 判断value是否为set中的元素,是则返回1,否则返回0 |
srandmember [set] | 随机返回set中的一个元素 |
5. sorted sets 类型及操作
- sorted set 在set的基础上增加了一个标识属性,它可以在set添加或修改元素时指定,每次指定,set会自动按标识调整顺序,set的每一个元素都会关联一个double类型的score。使用时往往我们把要排序的字段作为score存储,对象id则作为元素存储
- 操作方法:
命令 | 介绍 |
zadd [zset] sco “value” | 向zset中添加score为sco的value,如果value已存在,则仅修改score,同时返回0,否则返回1 |
zrange/zrangebyscore [zset] start end (wisthscores) | 返回zset中从索引start到end的元素,withscores可选是否同时显示元素对应的score |
zrem [zset] ‘value’ | 删除zset中值为value的元素 |
zincrby [zset] n ‘value’ | 如果zset中存在value,则令其score加n,否则添加value,令其score为n |
zrank [zset] ‘value’ | 返回zset中值为value的元素排名(按score从小到大) |
zrevrank [zset] ‘value’ | 按score从大到小返回元素排名 |
zrevrange [zset] start end | 返回zset[end…start] |
zcount [zset] start end | 返回zset在指定区间的数量 |
zcard [zset] | 返回zset中元素的个数 |
zscore [zset] ‘value’ | 返回值为value的元素的score |
zremrangebyrank [zset] start end | 删除zset按score从小到大排序索引从start到end的元素。 |
zremrangebyscore [zset] score1 score2 | 删除zset中score在score1到score2之间的元素 |
redis 常用命令
1. 键值相关命令
命令 | 介绍 | 返回值 |
keys [pattern] | 查询满足pattern的键 pattern如 *表示任意一个或多个字符,?表示任意字符,[a-z]表示a-z中任意一个字母 | 满足条件的键 |
exits [key] | 判断一个key是否存在 | 1存在,0不存在 |
del [key…] | 删除一个或多个key | 删除的数量 |
expire [key] second | 设置一个key的过期时间,以秒为单位 | 1设置成功,0key不存在或不能被设置 |
expireat [key] timestamp | 设置在时间戳timestamp过期 | 1设置成功,0key不存在或不能被设置 |
ttl [key] | 查取key的有效时长 | 返回时长,如果该键不存在或没有超时设置,则返回-1 |
move [key] database | 将当前数据库中的key移动到其他数据库database中 | 1成功,0失败 |
persist [key] | 移除给定key的过期时间 | 1成功,0没有该key或没有过期时间 |
randomkey | 随机获取key空间中的一个 | 一个随机获取的key |
rename [key] newkey | 重命名 key ,如果newkey已存在则覆盖 | 如果key不存在则返回错误信息,否则返回OK |
renamenx [key] newkey | 如果newkey存在,则失败且返回0。其它条件和RENAME一致。 | 1表示修改成功,否则0。 |
type [key] | 查询key的类型 | key类型 |
2. 服务器相关命令
命令 | 介绍 |
select database | 选择数据库(Redis 数据库编号从 0~15) |
quit | 退出 |
echo msg | 打印msg |
dbsize | 返回当前数据库中 key 的数目` |
info | 获取服务器的信息和统计 |
flushdb | 删除当前选择数据库中的所有 key |
flushall | 删除所有数据库中的所有 key |