Redis的基本数据类型
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
字符串(Strings)
字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据,例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。
一个字符串类型的值最多能存储512M字节的内容。
你可以用Redis字符串做许多有趣的事,例如你可以:
- 利用INCR命令簇(INCR, DECR, INCRBY)来把字符串当作原子计数器使用。
- 使用APPEND命令在字符串后添加内容。
- 将字符串作为GETRANGE 和 SETRANGE的随机访问向量。
- 在小空间里编码大量数据,或者使用 GETBIT 和 SETBIT创建一个Redis支持的Bloom过滤器
常用命令
描述 | 命令 | 备注 |
---|---|---|
设置一个key的value | set key value | |
设置一个key的value | set key value nx | 只有当这个key不存在时,再进行插入 |
set key value xx | 只有当这个key存在时,再更新这个key的值 | |
设置两个key的value | mset key1 value1 key2 value2 | 新增两个key |
msetnx key1 value1 key2 value2 | 只有当这个key不存在时,再进行新增, 原子性操作,一个失败全部失败 | |
在key后拼接值 | append key value | |
getrange key 0 4 | 正向索引 | |
getrange key 0 -1 | 从第一个元素取到最后一个元素,-1为负向索引第一位 | |
替换字符串 | setrange key 5 xxx | |
查看字符串长度 | strlen key | |
查看value编码 | object encoding key | |
将储存的值加上1 | incr key | |
decrby key 10 | 将储存的值减去10 | |
返回老的值,存进去新的值 | getset key value | |
设置该key的字节下的二进制索引对应值 | setbit key offset value | offset:二进制索引下标 |
在该key的给定字节区间中查找二进制值的索引位 ,返回的是第一次出现的位置 | bitops key bit start end | bit:所查找的二进制的值 start:开始检索的字节索引下标 end:结束检索的字节索引下标 |
在该key的给定字节区间中查找二进制每位下1出现的次数 | bitcount key start end | start:开始检索的字节索引下标 end:结束检索的字节索引下标 |
将多个key的二进制位进行按位与 或者按位或操作 | bitop operation destkey k1 k2… | operation:and :有0则0,全1为1 or:有1则1 |
列表(Lists)
Redis列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
LPUSH 命令插入一个新元素到列表头部,而RPUSH命令 插入一个新元素到列表的尾部。当 对一个空key执行其中某个命令时,将会创建一个新表。 类似的,如果一个操作要清空列表,那么key会从对应的key空间删除。这是个非常便利的语义, 因为如果使用一个不存在的key作为参数,所有的列表命令都会像在对一个空表操作一样。
常用命令
描述 | 命令 | 备注 |
---|---|---|
添加元素 | lpush key value1 value2… | lpush中的l :代表依次从左边添加元素 |
rpush key value1 value2… | rpush中的r : 代表依次从右边添加元素 | |
弹出一个元素 | lpop key | 从左边弹出一个元素 l操作:(同向命令)栈:后进先出 |
rpop key | 从右边弹出一个元素 r操作:(反向命令)队列:先进先出 | |
取出元素 | lrange key 0 -1 | 取出所有元素 l代表list,0和-1代表索引,正索引从0开始 负索引从-1开始 |
lindex key index | 取出对应下标的元素 | |
更改元素 | lset key index | 更改对应下标的元素 |
移除元素 | lrem key count value | 将该key中移除count个value值 如果count为正数:从前往后移除 如果count为0:移除所有 如果count为负数:从后往前移除 |
ltrim key start end | 移除start和end两端的数据 | |
插入元素 | linsert key berfore|after pivot value | 在该key的pivot(目标值)的前|后边 插入value,如果有多个pivot,那么在 第一个pivot前|后插入元素 |
统计list中有多少元素 | llen key | |
订阅key | blpop key … timeout | 订阅一个或多个key获取值,如果key不存在, 则进行阻塞等待,可以不设timeout |
集合(Sets)
Redis集合是一个无序的字符串合集。你可以以O(1) 的时间复杂度(无论集合中有多少元素时间复杂度都为常量)完成 添加,删除以及测试元素是否存在的操作。
Redis集合有着不允许相同成员存在的优秀特性。向集合中多次添加同一元素,在集合中最终只会存在一个此元素。实际上这就意味着,在添加元素前,你并不需要事先进行检验此元素是否已经存在的操作。
一个Redis列表十分有趣的事是,它们支持一些服务端的命令从现有的集合出发去进行集合运算。 所以你可以在很短的时间内完成合并(union),求交(intersection), 找出不同元素的操作。
常用命令
描述 | 命令 | 备注 |
---|---|---|
插入元素 | sadd key value… | |
查询元素 | smembers key | |
删除元素 | srem key value… | 移除该key中的value |
获取两个key的交集 | sinter key… | |
获取两个key的交集存放在新的key中 | sinterstore key key1 key2 | 取key1和key2的交集放在新创建的key中, 避免IO |
获取多个key的并集 | sunion key… | |
获取多个key的并集存放在新的key中 | sunionstore key key1 key2 | |
获取多个key的差集 | sdiff key1 key2 | 通过调整key的位置,获取不同的外差 |
随机取key中元素 | srandmember key count | count为正数:取出一个去重的结果集 (不能超过已有集) count为负数:取出一个带重复的结果集 (一定会满足你要的数量) count为0:不返回 |
弹出一个元素 | spop key |
哈希(Hashes)
Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象(eg:一个有名,姓,年龄等属性的用户)的数据类型。
常用命令
描述 | 命令 | 备注 |
---|---|---|
插入元素 | set key::param value | 给key增加属性param,并设置value |
查看元素 | keys key* | 查看该key所有属性 |
有序集合(Sorted sets)
Redis有序集合和Redis集合类似,是不包含 相同字符串的合集。它们的差别是,每个有序集合 的成员都关联着一个评分,这个评分用于把有序集 合中的成员按最低分到最高分排列。
使用有序集合,你可以非常快地(O(log(N)))完成添加,删除和更新元素的操作。 因为元素是在插入时就排好序的,所以很快地通过评分(score)或者 位次(position)获得一个范围的元素。 访问有序集合的中间元素同样也是非常快的,因此你可以使用有序集合作为一个没用重复成员的智能列表。 在这个列表中, 你可以轻易地访问任何你需要的东西: 有序的元素,快速的存在性测试,快速访问集合中间元素!
描述 | 命令 | 备注 |
---|---|---|
插入元素 | zdd key score value1 score value2… | score:评分(用于排序) |
查看元素(不带评分) | zrange key start end | start、end:元素下标(默认按评分从小到大排序) |
zrevrange key start end | 按评分从大到小排序 | |
查看元素(带评分) | zrange key start end withscores | |
按评分查看元素 | zrangebyscore key min max | min、max:评分 |
取出key里value对应的分值 | zscore key value | |
取出key里value对应的排名 | zrank key value | |
给key的value对应评分增加数 | zincrby key number value | |
查看并集(默认将评分求和) 存放在新的key中 | zunionstore key numberkey key1 key2… | numberkey:几个key合并 |
zunionstore key numberkey key1 key2… weight number1 number2 | number1、number2:权重(例:如果为0.5就取评分的一半) | |
zunionstore key numberkey key1 key2… weight number1 number2 aggregate num|max|min | 评分求和|取最大|取最小 |