Redis的数据类型和基本使用
Redis简介及特点
Redis是一个开源高效率的Key-Value内存数据库.
- 支持多种数据结构 string, list, set, zset, hash, 并支持push, pop, 交并差集等多种操作, 并支持数据的持久化.
- 全内存操作, 性能极高, 官方数据: read高达 110000次/s, write高达 81000次/s.
- 操作原子性, 单操作原子性, 多操作使用MULTI和EXEC指令包裹执行保证原子性.
- 支持数据持久化.
- 支持数据publish/subscribe.
- 支持master-slaver(主从)同步, 集群操作.
Redis常用数据结构及使用
启动redis-server (win)
假设redis的目录是 e:\soft\redis
- 命令行移动到redis运行目录: cd e:\soft\redis
- 启动服务端: redis-server.exe redis.conf (服务端exe 配置文件可选)
使用redis-cli操作redis
在redis运行目录执行: redis-cli -h 127.0.0.1 -p 6379 (-h, -p 默认参数就是127.0.0.1, 6379 可不写)
String 字符串常用操作
- String 是最基础的Redis数据类型, 它是二进制安全的, 意味着String可以存储任何类型的数据, 例如jpeg图像和序列化对象.
- 单个String 的最大长度是512MB
- 绝大部分操作的复杂度是O(1), 返回多个元素除外.
- 使用场景探索: 常用来做数据缓存
String 命令 | 描述 |
---|---|
SET key value | 设置指定key value 的值 |
GET key | 获取指定key 的值 |
GETRANGE key start end | 返回指定key 的子串 |
GETSET key value | 将给定key 的值设为value, 并返回key 的旧值(old value) |
GETBIT key offset | 对key 所储存的字符串值, 获取指定偏移量上的位(bit) |
MGET key1 key2 key3.. | 根据给定的key 数组, 返回value 数组 |
SETBIT key offset value | 对key 所储存的字符串值, 设置或清除指定偏移量上的位(bit) |
SETEX key seconds value | 将值 value 关联到key, 并将key 的过期时间设为 seconds (以秒为单位) |
SETNX key value | 只有在 key 不存在时设置key 的值 |
SETRANGE key offset value | 用value 参数覆写给定key 所储存的字符串值, 从偏移量offset 开始 |
STRLEN key | 返回key 所储存的字符串值的长度 |
MSET key value [key value] […] | 同时设置一个或多个key-value 键值对 |
MSETNX key value [key value] […] | 同时设置一个或多个key-value 对, 当且仅当所有给定key 都不存在 |
PSETEX key milliseconds value | 将值value 关联到key , 并将key 的过期时间设为milliseconds (以毫秒为单位) |
INCR key | 将key 中存储的数字加1 |
INCRBY key increment | 将key 所储存的值加上给定的增量值 |
INCRBYFLOAT key increment | 将key 所储存的值加上给定的浮点增量值 |
DECR key | 将key 中储存的数字值减1 |
DECRBY key decrement | 对key 所储存的值减去给定的减量值 |
APPEND key value | 如果key 已经存在并且是一个字符串, APPEND 命令将指定的value 追加到该key 原来值(value)的末尾 |
// 首先需要引入 Jedis 库, 启动redis 服务端
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379); // 服务器ip和端口
System.out.print(jedis.set("name", "zhaoxi")); // OK
System.out.println(" " + jedis.get("name")); // zhaoxi
System.out.print(jedis.append("name", "append")); // 12
System.out.print(" " + jedis.get("name")); // zhaoxiappend
}
Hash 哈希常用操作
- Hash 是字符串的键值对, 所以方便存储对象
- 每个hash key最多存储 2^32 - 1 个键值对.
- 新增和删除都是O(1), 其他视命令而定
- 使用场景探索: 对象的直接缓存, 不通过String存储
Hash 命令 | 描述 |
---|---|
HDEL key field1 [field2] | 删除一个或多个哈希表字段 |
HEXISTS key field | 查看哈希表 key 中, 指定的字段是否存在 |
HGET key field | 获取存储在哈希表中指定字段的值 |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
HINCRBY key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment |
HINCRBYFLOAT key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment |
HKEYS key | 获取所有哈希表中的字段 |
HLEN key | 获取哈希表中字段的数量 |
HMGET key field1 [field2] | 获取所有给定字段的值 |
HMSET key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
HSETNX key field value | 只有在字段 field 不存在时, 设置哈希表字段的值 |
HVALS key | 获取哈希表中所有值 |
HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对 |
// 首先需要引入 Jedis 库, 启动redis 服务端
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379); // 服务器ip和端口
System.out.print(jedis.hset("user", "name", "zhaoxi")); // 1
System.out.println(" " + jedis.hset("user", "desc", "pr")); // 1
System.out.print(jedis.hget("user", "name")); // zhaoxi
System.out.println(" " + jedis.hget("user", "desc")); // pr
}
List 列表常用操作
- List 是字符串的列表(Linked List), 按照插入顺序排序. 每个字符串首尾指向前后一个字符串.
- 单个 List 的最大长度是 2^32 - 1
- Redis 从首尾插入删除元素复杂度恒定为O(1), 从首尾访问元素复杂度也是O(1), 但是访问很大的列表时, 速度很慢, 复杂度为O(n)
- 使用场景探索: 配合lpush 和ltrim , 监测一个用户最近访问的最新n 个值
List 命令 | 描述 |
---|---|
BLPOP key1 [key2 ] timeout | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
BRPOPLPUSH source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
LINDEX key index | 通过索引获取列表中的元素 |
LINSERT key BEFORE | AFTER pivot value |
LLEN key | 获取列表长度 |
LPOP key | 移出并获取列表的第一个元素 |
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
LPUSHX key value | 将一个值插入到已存在的列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素 |
LREM key count value | 移除列表元素 |
LSET key index value | 通过索引设置列表元素的值 |
LTRIM key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 |
RPOP key | 移除列表的最后一个元素,返回值为移除的元素 |
RPOPLPUSH source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
RPUSH key value1 [value2] | 在列表中添加一个或多个值 |
RPUSHX key value | 为已存在的列表添加值 |
// 首先需要引入 Jedis 库, 启动redis 服务端
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println(jedis.lpush("list", "index1")); // 1
System.out.println(jedis.lpush("list", "index2")); // 2
System.out.println(jedis.lpush("list", "index3")); // 3
System.out.println(jedis.lrem("list", 1, "index1")); // 1
System.out.println(jedis.lrange("list", 0, -1)); // [index3, index2]
System.out.println(jedis.lpop("list")); // index3
System.out.println(jedis.lpop("list")); // index2
System.out.println(jedis.lrange("list", 0, -1)); // []
}
Set 集合常用操作
- Set 是不允许重复切无序的列表
- 单个 Set 的最大成员数 2^32 - 1个
- 向 Set 中添加, 删除, 检测元素存在时间复杂度都是O(1)
- 使用场景探索: 监测一个帖子的访问ip 地址, 每次访问的时候直接将ip 插入到set, 不用担心唯一的问题.
Set 命令 | 描述 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SCARD key | 获取集合的成员数 |
SDIFF key1 [key2] | 返回给定所有集合的差集 |
SDIFFSTORE destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SINTERSTORE destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 |
SISMEMBER key member | 判断 member 元素是否是集合 key 的成员 |
SMEMBERS key | 返回集合中的所有成员 |
SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
SPOP key | 移除并返回集合中的一个随机元素 |
SRANDMEMBER key [count] | 返回集合中一个或多个随机数 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SUNIONSTORE destination key1 [key2] | 所有给定集合的并集存储在 destination 集合中 |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
// 首先需要引入 Jedis 库, 启动redis 服务端
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println(jedis.sadd("set#name#1", "zhaoxi", "wuyu", "mailang")); // 3
System.out.println(jedis.sadd("set#name#1", "zhaoxi")); // 0 说明已存在
System.out.println(jedis.sadd("set#name#2", "zhaoxi","yiyi")); // 2
System.out.println(jedis.sdiff("set#name#2", "set#name#1")); // [yiyi]
System.out.println(jedis.sinter("set#name#2", "set#name#1")); // [zhaoxi]
System.out.println(jedis.sunion("set#name#2", "set#name#1")); // [wuyu, mailang, zhaoxi, yiyi]
System.out.println(jedis.del("set#name#2", "set#name#1")); // 2
}
ZSet 有序集合常用操作
- ZSet 类似 Set 和 Hash 的混合体.
- 每个有序元素都和一个浮点数(分数)相关联.
- 添加,删除,查找的复杂度都是O(1)
- 使用场景探索: 游戏中的排名, 榜单.
ZSet 命令 | 描述 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
ZCARD key | 获取有序集合的成员数 |
ZCOUNT key min max | 计算在有序集合中指定区间分数的成员数 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
ZINTERSTORE destination numkeys key [key …] | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
ZLEXCOUNT key min max | 在有序集合中计算指定字典区间内成员数量 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合成指定区间内的成员 |
ZRANGEBYLEX key min max [LIMIT offset count] | 通过字典区间返回有序集合的成员 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员 |
ZRANK key member | 返回有序集合中指定成员的索引 |
ZREM key member [member …] | 移除有序集合中的一个或多个成员 |
ZREMRANGEBYLEX key min max | 移除有序集合中给定的字典区间的所有成员 |
ZREMRANGEBYRANK key start stop | 移除有序集合中给定的排名区间的所有成员 |
ZREMRANGEBYSCORE key min max | 移除有序集合中给定的分数区间的所有成员 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
ZSCORE key member | 返回有序集中,成员的分数值 |
ZUNIONSTORE destination numkeys key [key …] | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成员和元素分值) |
// 首先需要引入 Jedis 库, 启动redis 服务端
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println(jedis.zadd("zset#score#181229", 10, "zhaoxi")); // 1
System.out.println(jedis.zadd("zset#score#181229", 20, "yiyi")); // 1
System.out.println(jedis.zadd("zset#score#181229", 30, "wuyu")); // 1
System.out.println(jedis.zcard("zset#score#181229")); // 3
System.out.println(jedis.zincrby("zset#score#181229",5,"zhaoxi")); // 15.0
System.out.println(jedis.zrevrange("zset#score#181229", 0, -1)); // [wuyu, yiyi, zhaoxi]
System.out.println(jedis.del("zset#score#181229")); //1
}
简单总结
Redis 的数据结构丰富, 为 Redis 提供了丰富的应用场景. 所以非常受欢迎, 使用中熟练掌握所有结构, 能让我们工作如虎添翼.
参考文献
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 zhao4xi@126.com
文章标题:Redis的数据类型和基本使用
文章字数:3.2k
本文作者:Zhaoxi
发布时间:2018-12-29, 15:13:48
最后更新:2019-09-21, 15:14:24
原始链接:http://zhao4xi.github.io/2018/12/29/Redis的数据类型和基本使用/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。