前言

在啃完上节的Redis的配置文件redis.conf这块 “硬石头” 之后,接下来,咱们继续啃Redis数据类型…
Redis 相对于 Memcache、Tokyo Tyrant 等其他的缓存产品,有一个很明显的优势,就是Redis身为键值型数据库不仅仅只是存储key-value的基础类型数据,还提供了诸如listsetzset,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数据类型及用法】相关推荐

  1. redis入门(三)

    文章目录 @[toc] redis入门(三) 目录 前言 事务 原理 Lua脚本 安装 脚本命令 EVAL EVALSHA lua和redis互操作 SCRIPT EXISTS SCRIPT FLUS ...

  2. Redis中三种特殊数据类型

    本文来说下Redis中三种特殊数据类型 文章目录 Gerspatial地理位置 Hyperloglog基数统计 Bitmap位图 Gerspatial地理位置 一共 6 个命令: GEOADD GEO ...

  3. 16-SpringBoot之Redis(三)——Redis事务机制

    SpringBoot之Redis(三)--Redis事务机制 1. Redis 事务执行过程 2. 开启事务支持 3. 测试 4. 测试结果说明 5. 源码下载 1. Redis 事务执行过程 Red ...

  4. 大数据 互联网架构阶段 Redis(三)redis集群

    Redis(三) redis集群 一. redis哨兵模式的缺点 问题一 : 横向扩展不方便 , 一旦扩展 , 无论代码结构多么简单, 都需要修改 问题二 : 散列分布式算法是hash一致性 , 无论 ...

  5. 【Redis】三、Redis安装及简单示例

    (四)Redis安装及使用   Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装.   安装完成后,通过r ...

  6. 【redis】三种redis数据导出导入方式

    文章目录 1.概述 一.redis-dump方式 二.aof方式导入 三.rdb文件迁移方式 1.概述 转载:三种redis数据导出导入方式 一.redis-dump方式 redis-dump安装 y ...

  7. redis的三种特殊数据类型

    三种特殊数据类型 GEO地理位置 简介 Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作.来实现诸如附近位置.摇一 ...

  8. redis学习--三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap

    三种特殊数据类型,GEO地理位置,HyperLogLog,BitMap GEO地理位置 简介 Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存 ...

  9. 详解redis的三种特殊数据类型

    14天学习训练营导师课程: 郑为中<Vue和SpringBoot打造假日旅社管理系统> 努力是为了不平庸~ 学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识 ...

最新文章

  1. 移位运算[c][code]
  2. (JAVA)从零开始之--打印流PrintStream记录日志文件
  3. 苹果Mac操作系统下怎么显示隐藏文件
  4. cogs 539. 牛棚的灯
  5. 重置npm设置_密码重置用户流程4部曲
  6. 【Linux】一步一步学Linux——talk命令(238)
  7. 程序员要常做好的几件事
  8. rrdtool zabbix mysql_MRTG、Cacti、Rrdtool、Nagios、Zabbix安装比较
  9. iOS开发UI篇—Quartz2D使用(绘图路径)
  10. Android L(5.0)源码之图形与图像处理之动画——Frame、Tween、属性动画、SurfaceView...
  11. 26岁创造UNIX的编程大佬,退休后却成为一名飞行员
  12. mave工程中的一个类调用另一个聚合工程的一个类_软件工程系列-UML1
  13. 中国最假的36句话(转自傲游论坛)
  14. DMX协议和RDM协议
  15. 大牛直播SDK-Windows RTMP/RTSP/本地FLV播放器使用说明
  16. 关于数学建模(或科研论文)的画图学习建议
  17. 31个全网最常用python实现(体系学习,学完显著提高代码复用能力)
  18. 【今日学长】来自柚子帮学长--英国留学租房攻略!
  19. 互联网手机卡资费对比
  20. C语言中sort函数的用处

热门文章

  1. 2021年青岛十九中高考成绩查询,2021年青岛高中学校排名一览表,青岛比较好的高中学校排名...
  2. [VS]批量读取文件夹,自动改图片名字
  3. php加mysql怎么写直播_nginx + php + mysql直播管理-环境配置
  4. CocosCreater 项目文件结构及需纳入版本控制的文件
  5. 【涨知识】蜂蜜、蜂胶、蜂王浆和蜂花粉这些蜂产品的作用和区别
  6. Maya mash系统的简单介绍--通用节点Distribute节点
  7. jquery 移除onfocus事件
  8. Android新浪微博获取评论信息、发表评论、转发微博等.
  9. avio_open成功avformat_write_header失败
  10. android默认安装位置,修改Android手机的软件默认安装位置