Marco's Java【Redis入门(三) 之 Redis数据类型及用法】
前言
在啃完上节的Redis的配置文件redis.conf
这块 “硬石头” 之后,接下来,咱们继续啃Redis数据类型…
Redis 相对于 Memcache、Tokyo Tyrant 等其他的缓存产品,有一个很明显的优势,就是Redis身为键值型数据库不仅仅只是存储key-value的基础类型数据,还提供了诸如list
,set
,zset,hash
等数据结构的存储,可谓是非常强大了!
因此本节会针对于 Redis的数据类型及其用法来做讲解。
文章目录
- 前言
- Redis中的常用命令
- String数据类型
- List数据类型
- Hash数据类型
- Set数据类型
- Zset数据类型
Redis中的常用命令
命令 | 解释 |
---|---|
keys * | 获取所有的key |
select 0 | 选择第一个库,默认16个数据库,类似数组下表从零开始,初始默认使用零号库 |
move key1 | 将当前的数据库key移动到某个数据库(key为1则移动到第二个数据库),如果目标库有,则不能移动 |
flushdb | 清除指定库 |
flushall | 清除所有库,传说中的删库跑路 |
randomkey | 从当前数据库中随机返回一个key |
type key | key的类型,如string、hash等 |
del key | 删除key |
exists key | 判断是否存在key |
expire key 10 | 10秒后key过期消失 |
pexpire key | 1000 毫秒后key过期消失 |
persist key | 删除过期时间,如果设置了expire key 10之后执行该命令,会取消key的过期任务 |
ttl key | 查看还有多少秒过期,-1表示永不过期,-2表示已过期 |
ttl key | 查看还有多少秒过期,-1表示永不过期,-2表示已过期 |
dbsize | 查看当前数据库的key的数量 |
注意:
Redis默认的16个库都是同样密码,要么都OK要么一个也连接不上,Redis索引都是从零开始。
Redis的命令不区分大小写,但是key 严格区分大小写!!!
String数据类型
字符串类型是编程语言和应用程序中最常见和最有用的数据类型,也是Redis的基本数据类型之一,事实上,Redis中所有键都必须是字符串。一个 Reids中的字符串value最多为512M
。
设置及获取键和值
## set key value 设置键值对
## get key 根据key获取value值
## getrange key x y 字符串分段(0 -1是全部 0 -2 则为(n-1))
#####################################################################
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> set name marco
OK
127.0.0.1:6379> getrange name 0 -1
"marco"
127.0.0.1:6379> getrange name 0 -2
"marc"
设置值并返回旧值
## getset key new_value 设置值,返回旧值
#####################################################################
127.0.0.1:6379> getset name sunnie
"marco"
127.0.0.1:6379> get name
"sunnie"
批量设置和批量获取
## mset key1 key2 批量设置
## mget key1 key2 批量获取
#####################################################################
127.0.0.1:6379> mset key2 value2 key3 value3
OK
127.0.0.1:6379> mget key2 key3
1) "value2"
2) "value3"
插入键值对
注意了,这里指的是当插入的hash中key-value的key如果之前已经存在,则插入不成功。
## setnx key value 不存在就插入(not exists)
#####################################################################
127.0.0.1:6379> setnx key4 value4
#插入成功
(integer) 1
127.0.0.1:6379> setnx key3 value3
#很显然key3已经存在了,因此插入失败
(integer) 0
指定位置并替换值
## setrange key index value 从index开始替换value
#####################################################################
#设置名称为marco
127.0.0.1:6379> set name marco
OK
127.0.0.1:6379> get name
"marco"
#从字符的index为1开始替换字符串arco为etthews
127.0.0.1:6379> setrange name 1 etthews
(integer) 8
127.0.0.1:6379> get name
"metthews"
键的递增与递减
## incr key 递增
## decr key 递减
## decrby key 按指定步长递减
## incrby key 按指定步长递增
## incrbyfloat key 增减浮点数
#####################################################################
#设置年龄age为key,value为17
127.0.0.1:6379> set age 17
OK
#自增长
127.0.0.1:6379> incr age
(integer) 18
#自递减
127.0.0.1:6379> decr age
(integer) 17
#自增长且步长为10
127.0.0.1:6379> decrby age 10
(integer) 7
#自递减且步长为10
127.0.0.1:6379> incrby age 10
(integer) 17
#自增长且步长为2.5 (浮点数)
127.0.0.1:6379> incrbyfloat age 2.5
"19.5"
字符串追加
## append key value 追加
#####################################################################
127.0.0.1:6379> set name marco
OK
127.0.0.1:6379> append name ' zheng'
(integer) 11
127.0.0.1:6379> get name
"marco zheng"
获取字符串长度
## strlen key 长度
#####################################################################
127.0.0.1:6379> strlen name
(integer) 11
获取键的类型
## object encoding key 得到key 的类型 string里面有三种编码## int 用于能够副作用64位有符号整数表示的字符串## embstr 用于长度小于或等于44字节 Redis3.x中是39字节,这种类型的编码在内存使用时性能更好## raw 用于长度大于44字节的
#####################################################################
#此时name为marco
127.0.0.1:6379> object encoding name
"raw"
#此时age为数字18
127.0.0.1:6379> object encoding age
"embstr"
#设置key1为有符号整数-1
127.0.0.1:6379> set key1 -1
OK
127.0.0.1:6379> object encoding key1
List数据类型
列表是应该程序开发中非常有用的数据类型之一,它能够存在一组对象,因此它也可以被用于栈或者队列,在Redis中,与键相关联的值可以是字符串组成的列表,Redis中的列表更像是数据结构中的双向链表LinkedList。
列表数据插入
## lpush list a b c 左插入
## rpush list x y z 右插入
## linsert list before x 插入
## linsert list after x 插入|--命令用于在列表的元素前或者后插入元素。 当指定元素不存在于列表中时,不执行任何操作。 |--当列表不存在时,被视为空列表,不执行任何操作。如果 key 不是列表类型,返回一个错误。
#####################################################################
#向列表左方依次插入a b c,结果为 c b a
127.0.0.1:6379> lpush list a b c
(integer) 3
#向列表右方依次插入e f g,结果为 c b a e f g
127.0.0.1:6379> rpush list e f g
(integer) 6
#往列表数据中的g前插入数据h,结果为 c b a e f h g,同理如果使用after则是在数据g后插入h
127.0.0.1:6379> linsert list before g h
(integer) 7
查看列表数据
## lrange list 0 -1 取出数据集合(0 -1是取出所有 0 1则是取第一个和第二个)
#####################################################################
#取出所有
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
4) "e"
5) "f"
6) "g"
#取出第一个和第二个
127.0.0.1:6379> lrange list 0 1
1) "c"
2) "b"
弹出元素
##lpop list 弹出集合最后一个元素 弹出之后就没有了哦
##rpop list 弹出第一个元素 弹出之后就没有了哦
#####################################################################
#当前的list数据为c b a e f g
127.0.0.1:6379> lpop list
"c"
127.0.0.1:6379> rpop list
"g"
查看list的数据长度
##llen list 查看list长度
#####################################################################
#当前list数据为b a e f
127.0.0.1:6379> llen list
(integer) 4
删除list的值
##lrem list count value 删除|-COUNT 的值可以是以下几种:|--count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。|--count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。|--count = 0 : 移除表中所有与 VALUE 相等的值。
#####################################################################
#从左往右查找并删除值为b的一条数据
127.0.0.1:6379> lrem list 1 b
(integer) 1
#从右往左查找并删除值为f的一条数据
127.0.0.1:6379> lrem list -1 f
(integer) 1
#移除表中所有值为a的数据
127.0.0.1:6379> lrem list 0 a
(integer) 1
获取、设置指定索引的值
## lindex list 0 获取指定索引的值
#####################################################################
#获取索引为0的值,为e
127.0.0.1:6379> lindex list 0
"e"
#在索引为1处设值为f,因为当前list的长度为1,因此会抛出索引越界异常
127.0.0.1:6379> lset list 1 f
(error) ERR index out of range
#此时在索引为0处设置值为f,则不会抛出异常,并覆盖之前的值e
127.0.0.1:6379> lset list 0 f
OK
修剪列表
## ltrim list x y |--对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。|--下标 0 表示列表的第一个元素,下标 1 表示列表的第二个元素
#####################################################################
#往列表左方插入数据 m a r c o
127.0.0.1:6379> lrange list 0 -1
1) "o"
2) "c"
3) "r"
4) "a"
5) "m"
#剪裁list,只保留index为 0 1 2 的数据,因此剪裁之后的数据为 r c o
127.0.0.1:6379> ltrim list 0 2
OK
127.0.0.1:6379> lrange list 0 -1
1) "o"
2) "c"
3) "r"
转移列表数据
## rpoplpush list1 list2 转移列表list1和list2的数据|--命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回
############################################################
#向列表list1中添加数据 a b c
127.0.0.1:6379> rpush list1 a b c
(integer) 3
#向列表list2中添加数据 d e f
127.0.0.1:6379> rpush list2 d e f
(integer) 3
#将list1中的最右边的元素c弹出,并往list2左边push进去
127.0.0.1:6379> rpoplpush list1 list2
"c"
查看list1的值为 a b
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
查看list2的值为 c d e f
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "d"
3) "e"
4) "f"
Hash数据类型
设置及获取哈希表中字段的值
其实可以看做是往数据库中存了一个对象,对象名为myhash,字段name的值为marco
## hset myhash key value|--命令用于为哈希表中的字段赋值|--如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作|--如果字段已经存在于哈希表中,旧值将被覆盖
## hget myhash key 获取myhash中的key对应的值
## hmset myhash key1 value1 key2 value2 ... 批量设置myhash中的键值对
## hsetnx myhash key value 设置键值对,如果键值对已经存在,则不会覆盖原来的值
#####################################################################
127.0.0.1:6379> hset myhash name marco
(integer) 1
127.0.0.1:6379> hget myhash name
"marco"
#批量设置myhash的键值对
127.0.0.1:6379> hmset myhash age 18 address '武汉'
OK
127.0.0.1:6379> hget myhash address
"\xe6\xad\xa6\xe6\xb1\x89
#设置键值对name=marco,但是此前已经有了相同的键值对,因此数据插入不成功
127.0.0.1:6379> hsetnx myhash name marco
(integer)
根据上面的实验结果可以看出,当值为中文的时候,Redis会将其转化为Unicode的形式。
获取哈希表中所有的key和value
## hgetall myhash 获取所有的域和值
#####################################################################
127.0.0.1:6379> hgetall myhash
1) "name"
2) "marco"
3) "age"
4) "18"
5) "address"
6) "\xe6\xad\xa6\xe6\xb1\x89"
判断指定的key是否存在
## hexists myhash key 是否存在该key
#####################################################################
#如果返回值大于0,表示有指定的key,否则就没有
127.0.0.1:6379> hexists myhash name
(integer) 1
删除哈希表中的字段
## hdel myhash key 删除
#####################################################################
#删除key为address的键值对
127.0.0.1:6379> hdel myhash address
(integer) 1
哈希表长度
其实就是哈希表中键值对的个数
## hlen myhash 长度
#####################################################################
127.0.0.1:6379> hlen myhash
(integer) 2
取出所有的key或者value
## hkeys myhash 取出所有的key
## hvals myhash 取出所有的value
#####################################################################
127.0.0.1:6379> hkeys myhash
1) "name"
2) "age"
127.0.0.1:6379> hvals myhash
1) "marco"
2) "18"
Set数据类型
添加及获取数据
## sadd set key 添加数据
## smembers set 获取数据
#####################################################################
#往set集合members中添加两条数据 marco sunnie
127.0.0.1:6379> sadd members marco sunnie
(integer) 2
#获取members集合中所有数据
127.0.0.1:6379> smembers members
1) "marco"
2) "sunnie"
删除数据
## srem set key 删除指定数据
#####################################################################
127.0.0.1:6379> srem members sunnie
(integer) 1
判断元素是否在集合中
## sismember set key 判断元素是否在集合中
#####################################################################
#判断marco是否在members集合中,返回值为1表示true,0表示为false
127.0.0.1:6379> sismember members marco
(integer) 1
获取集合中元素的个数
## scard set 获取set集合中元素个数
#####################################################################
127.0.0.1:6379> scard members
(integer) 1
随机获取集合中的元素
## srandmember set 随机获取集合中的元素
#####################################################################
127.0.0.1:6379> srandmember members
"sunnie"
从集合中弹出元素
## spop 从集合中弹出一个元素
#####################################################################
127.0.0.1:6379> spop members
"sunnie"
集合间运算
## sdiff | sinter | sunion 操作:集合间运算:差集 | 交集 | 并集
#####################################################################
127.0.0.1:6379> sadd members marco
(integer) 1
127.0.0.1:6379> sadd members2 jack
(integer) 1
127.0.0.1:6379> sdiff members members2
1) "marco"
127.0.0.1:6379> sdiff members2 members
1) "jack"
127.0.0.1:6379> sinter members members2
(empty list or set)
127.0.0.1:6379> sunion members members2
1) "marco"
2) "jack"
Zset数据类型
添加并查看存放的数据
## zadd zset score key 在指定的score处存放key
#####################################################################
127.0.0.1:6379> zadd zset 1 one
(integer) 1
127.0.0.1:6379> zadd zset 2 two
(integer) 1
127.0.0.1:6379> zadd zset 3 three
(integer) 1
#获取zset集合范围值,0 -1表示获取全部值
127.0.0.1:6379> zrange zset 0 -1
1) "one"
2) "two"
3) "three"
#获取zset集合范围值,并列出score
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
设置增长分数
## zincrby zset score key 增长分数
#####################################################################
127.0.0.1:6379> zincrby zset 1 one
"2"
127.0.0.1:6379> zincrby zset 1 one
"3"
获取score分数
## zscore zset two 获取分数
#####################################################################
127.0.0.1:6379> zscore zset three
"3"
获取zset的元素个数
## zcard zset 获取zset元素数量
#####################################################################
127.0.0.1:6379> zcard zset
(integer) 5
获取指定范围的值
## zrangebyscore zset 10 25 withscores 获取指定范围的值和score
zrangebyscore zset 10 25 withscores limit start end 分页
#####################################################################
#获取指定score范围的值和score
127.0.0.1:6379> zrangebyscore zset 1 3 withscores
1) "one"
2) "3"
3) "three"
4) "3"
#获取指定score范围的值和score并分页,start为起始的score index,end为结束的score index
127.0.0.1:6379> zrangebyscore zset 1 5 withscores limit 0 4
1) "one"
2) "3"
3) "three"
4) "3"
5) "four"
6) "4"
7) "two"
8) "4"
获取zset的元素个数
## zcard zset 获取zset元素数量
## zcount zset 获得指定分数范围内的元素个数
#####################################################################
127.0.0.1:6379> zcard zset
(integer) 5
#目前zset中包含元素 one 3 three 3 four 4 two 4 five 5,因此分数为0-3的一共有两个元素,故值为2
127.0.0.1:6379> zcount zset 0 3
(integer) 2
删除zset的元素
## zrem zset one two 删除一个或多个元素
## zremrangebyrank zset 0 1 按照排名范围删除元素
## zremrangebyscore zset 0 1 按照分数范围删除元素
#####################################################################
#根据key值删除元素
127.0.0.1:6379> zrem zset one two
(integer) 2
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "three"
2) "3"
3) "four"
4) "4"
5) "five"
6) "5"
#根据score的排名删除元素,当前排名为 0 和 1 的分别是three和four
127.0.0.1:6379> zremrangebyrank zset 0 1
(integer) 2
#根据指定score的值删除元素,但当前score中没有 0 1,因此返回值为0
127.0.0.1:6379> zremrangebyscore zset 0 1
(integer) 0
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "five"
2) "5"
元素排名
## zrank zset 0 -1 分数最小的元素排名为0
## zrevrank zset 0 -1 分数最大的元素排名为0
#####################################################################
127.0.0.1:6379> zadd zset 1 one 2 two 3 three 4 four
(integer) 4
127.0.0.1:6379> zrange zset 0 -1 withscores1) "one"2) "1"3) "two"4) "2"5) "three"6) "3"7) "four"8) "4"
127.0.0.1:6379> zrank zset one
(integer) 0
127.0.0.1:6379> zrank zset two
(integer) 1
127.0.0.1:6379> zrevrank zset one
(integer) 4
127.0.0.1:6379> zrevrank zset two
(integer) 3
Marco's Java【Redis入门(三) 之 Redis数据类型及用法】相关推荐
- redis入门(三)
文章目录 @[toc] redis入门(三) 目录 前言 事务 原理 Lua脚本 安装 脚本命令 EVAL EVALSHA lua和redis互操作 SCRIPT EXISTS SCRIPT FLUS ...
- Redis中三种特殊数据类型
本文来说下Redis中三种特殊数据类型 文章目录 Gerspatial地理位置 Hyperloglog基数统计 Bitmap位图 Gerspatial地理位置 一共 6 个命令: GEOADD GEO ...
- 16-SpringBoot之Redis(三)——Redis事务机制
SpringBoot之Redis(三)--Redis事务机制 1. Redis 事务执行过程 2. 开启事务支持 3. 测试 4. 测试结果说明 5. 源码下载 1. Redis 事务执行过程 Red ...
- 大数据 互联网架构阶段 Redis(三)redis集群
Redis(三) redis集群 一. redis哨兵模式的缺点 问题一 : 横向扩展不方便 , 一旦扩展 , 无论代码结构多么简单, 都需要修改 问题二 : 散列分布式算法是hash一致性 , 无论 ...
- 【Redis】三、Redis安装及简单示例
(四)Redis安装及使用 Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装. 安装完成后,通过r ...
- 【redis】三种redis数据导出导入方式
文章目录 1.概述 一.redis-dump方式 二.aof方式导入 三.rdb文件迁移方式 1.概述 转载:三种redis数据导出导入方式 一.redis-dump方式 redis-dump安装 y ...
- redis的三种特殊数据类型
三种特殊数据类型 GEO地理位置 简介 Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作.来实现诸如附近位置.摇一 ...
- redis学习--三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap
三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap GEO地理位置 简介 Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存 ...
- 详解redis的三种特殊数据类型
14天学习训练营导师课程: 郑为中<Vue和SpringBoot打造假日旅社管理系统> 努力是为了不平庸~ 学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识 ...
最新文章
- 移位运算[c][code]
- (JAVA)从零开始之--打印流PrintStream记录日志文件
- 苹果Mac操作系统下怎么显示隐藏文件
- cogs 539. 牛棚的灯
- 重置npm设置_密码重置用户流程4部曲
- 【Linux】一步一步学Linux——talk命令(238)
- 程序员要常做好的几件事
- rrdtool zabbix mysql_MRTG、Cacti、Rrdtool、Nagios、Zabbix安装比较
- iOS开发UI篇—Quartz2D使用(绘图路径)
- Android L(5.0)源码之图形与图像处理之动画——Frame、Tween、属性动画、SurfaceView...
- 26岁创造UNIX的编程大佬,退休后却成为一名飞行员
- mave工程中的一个类调用另一个聚合工程的一个类_软件工程系列-UML1
- 中国最假的36句话(转自傲游论坛)
- DMX协议和RDM协议
- 大牛直播SDK-Windows RTMP/RTSP/本地FLV播放器使用说明
- 关于数学建模(或科研论文)的画图学习建议
- 31个全网最常用python实现(体系学习,学完显著提高代码复用能力)
- 【今日学长】来自柚子帮学长--英国留学租房攻略!
- 互联网手机卡资费对比
- C语言中sort函数的用处
热门文章
- 2021年青岛十九中高考成绩查询,2021年青岛高中学校排名一览表,青岛比较好的高中学校排名...
- [VS]批量读取文件夹,自动改图片名字
- php加mysql怎么写直播_nginx + php + mysql直播管理-环境配置
- CocosCreater 项目文件结构及需纳入版本控制的文件
- 【涨知识】蜂蜜、蜂胶、蜂王浆和蜂花粉这些蜂产品的作用和区别
- Maya mash系统的简单介绍--通用节点Distribute节点
- jquery 移除onfocus事件
- Android新浪微博获取评论信息、发表评论、转发微博等.
- avio_open成功avformat_write_header失败
- android默认安装位置,修改Android手机的软件默认安装位置