NoSql之Redis系列一: Redis的数据类型和基本使用
NoSql之Redis系列一: Redis的数据类型和基本使用
- Redis简介及特点
- Redis常用数据结构及使用
- 启动redis-server (win)
- 使用redis-cli操作redis
- String 字符串常用操作
- Hash 哈希常用操作
- List 列表常用操作
- Set 集合常用操作
- ZSet 有序集合常用操作
- 简单总结
- 参考文献
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")); // zhaoxiSystem.out.print(jedis.append("name", "append")); // 12System.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")); // 1System.out.println(" " + jedis.hset("user", "desc", "pr")); // 1System.out.print(jedis.hget("user", "name")); // zhaoxiSystem.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")); // 1System.out.println(jedis.lpush("list", "index2")); // 2System.out.println(jedis.lpush("list", "index3")); // 3System.out.println(jedis.lrem("list", 1, "index1")); // 1System.out.println(jedis.lrange("list", 0, -1)); // [index3, index2]System.out.println(jedis.lpop("list")); // index3System.out.println(jedis.lpop("list")); // index2System.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")); // 3System.out.println(jedis.sadd("set#name#1", "zhaoxi")); // 0 说明已存在System.out.println(jedis.sadd("set#name#2", "zhaoxi","yiyi")); // 2System.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")); // 1System.out.println(jedis.zadd("zset#score#181229", 20, "yiyi")); // 1System.out.println(jedis.zadd("zset#score#181229", 30, "wuyu")); // 1System.out.println(jedis.zcard("zset#score#181229")); // 3System.out.println(jedis.zincrby("zset#score#181229",5,"zhaoxi")); // 15.0System.out.println(jedis.zrevrange("zset#score#181229", 0, -1)); // [wuyu, yiyi, zhaoxi]System.out.println(jedis.del("zset#score#181229")); //1
}
简单总结
Redis 的数据结构丰富, 为 Redis 提供了丰富的应用场景. 所以非常受欢迎, 使用中熟练掌握所有结构, 能让我们工作如虎添翼.
参考文献
- 菜鸟教程 http://www.runoob.com/redis/redis-tutorial.html
- Redis官网 https://redis.io/
NoSql之Redis系列一: Redis的数据类型和基本使用相关推荐
- 深入剖析Redis系列(七) - Redis数据结构之列表
前言 列表(list)类型是用来存储多个 有序 的 字符串.在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表.获取 指定索引下标 ...
- 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...
- 深入剖析Redis系列(五) - Redis数据结构之字符串
前言 字符串类型 是 Redis 最基础的数据结构.字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON.XML).数字(整数.浮点数),甚至是 二进制(图片.音频.视频),但 ...
- redis系列:redis介绍与安装
前言 这个redis系列的文章将会记录博主学习redis的过程.基本上现在的互联网公司都会用到redis,所以学习这门技术于你于我都是有帮助的. 博主在写这个系列是用的是目前最新版本4.0.10,虚拟 ...
- java redis快速入门_快速入门Redis系列(3)——Redis的JavaAPI操作(附带练习)
作为快速入门Redis系列的第三篇博客,本篇为大家带来的是Redis的JavaAPI操作. 码字不易,先赞后看! Redis的JavaAPI操作 看完了上一篇博客,相信大家对于Redis的数据类型有了 ...
- Redis系列:Redis的概述与安装
Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. 本篇内容包括:Redis 简介(为什么快? ...
- redis 启动无输出_深入剖析Redis系列: Redis入门简介与主从搭建
前言 Redis 是一种基于 键值对 的 NoSQL 数据库.与很多键值对数据库不同,Redis 提供了丰富的 值数据存储结构,包括 string(字符串).hash(哈希).list(列表).set ...
- 【Redis系列】Redis发布版本历史及特性
目录 概述 Redis2.6 Redis2.8 Redis3.0 Redis3.2 Redis4.0 Redis5.0 Redis6.0 Redis7.0 概述 Redis 使用标准版本标记进行版本控 ...
- 【吃透Redis系列】Redis简介
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
最新文章
- matlab中线性规划优化计算方法和实例
- Oracle 热备份
- 使用Spring Data REST将Spring Data JPA存储库导出为REST服务
- C语言实现二叉树-04版
- 北邮 鲁鹏老师 视频笔记
- Oracle expdp和impdp
- 在Visual Studio Code运行单个js文件需要用到插件
- 解决vim中鼠标右键无法复制的问题
- Mac OS X 系统修改Terminal终端配色
- android检查内存泄露工具,Android内存泄露检测 LeakCanary2.0(Kotlin版)的实现原理
- ai里怎样取消扩展外观_扩展AI:困难的5个原因
- 暑期聊天室的挣扎:Linux C编程学习笔记(一)
- 【方向盘】使用IDEA的60+个快捷键分享给你,权为了提效(运行/调试篇)
- php开源视频cms,迅睿PHP开源视频电影CMS系统
- 八大流行的微服务架构设计模式探究
- c语言switch优点,关于C语言switch
- html中颜色取样器工具,photoshop基础教程:颜色取样器工具的使用详解
- 从西直门立交桥谈IT架构与重构
- Try to increase the 20000ms adb execution timeout represented by 'uiautomator2ServerInstallTimeout'
- BIOS Setup设置方法
热门文章
- Python爬取2345天气网
- 艾伟:WCF从理论到实践(3):八号当铺之黑色契约
- 数学证明到底是什么?
- C语言——副作用(side effects)和序列点(sequence points)
- MATLAB colorbar颜色红黄绿,Matlab获取colorbar颜色并转换为需要的CPT文件
- -2147483648是不是int常量
- linux ad接口实验结论,计算机输入输出系统接口实验报告 · 东南大学Linux俱乐部...
- IBM蓝色基因超级计算机运行Plan9操作系统
- Word中的图片设置嵌入式之后显示不全问题
- 英文连写字体怎么练_一篇文章教孩子学会衡水英文字体,建议收藏!