Redis的几个数据类型,包含简单命令举列

Posted 丁CCCCC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的几个数据类型,包含简单命令举列相关的知识,希望对你有一定的参考价值。

一、String 数据类型

1.1 概述

String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等

1.2 APPEND / SET / GET / STRLEN

APPEND

语法:APPEND key value追加键值,并返回追加后的长度(若键不存在,则相当于创建)

127.0.0.1:6379> exists cc1				# 判断cc1键有没有,存在返回1,不存在返回0
(integer) 0
127.0.0.1:6379> append cc1 "666"		# append自动创建,返回的是当前value的长度,也就是666的长度
(integer) 3
127.0.0.1:6379> keys *					# 查看cc1已创建有
1) "cc1"
2) "key:__rand_int__"
3) "counter:__rand_int__"
4) "cc4"
5) "mylist"
6) "myset:__rand_int__"
7) "cc3"
8) "teacher"
127.0.0.1:6379> get cc1
"666"
127.0.0.1:6379> append cc1 "777"		# 追加创建777,不是覆盖,返回的长度为追加后总长度
(integer) 6
127.0.0.1:6379> get cc1					# 查看内容
"666777"

SET / GET

set:为键设置新值,会覆盖原有值

get:获取该键内容

127.0.0.1:6379> set cc1 333
OK
127.0.0.1:6379> get cc1
"333"
127.0.0.1:6379> set cc1 222
OK
127.0.0.1:6379> get cc1
"222"

STRLEN

获取指定key的字符长度

127.0.0.1:6379> get cc1
"222"
127.0.0.1:6379> strlen cc1
(integer) 3

1.3 INCR / DECR / INCRBY / DECRBY

**INCR key:key值递增加1(key值必须是整数)

127.0.0.1:6379> set cc1 100
OK
127.0.0.1:6379> incr cc1			# 递增加1
(integer) 101
127.0.0.1:6379> incr cc1
(integer) 102

127.0.0.1:6379> del cc1				# 删除键内容
(integer) 1	
127.0.0.1:6379> incr cc1			# 递增加1,删除后的键默认为空值,设定为0
(integer) 1
127.0.0.1:6379> incr cc1
(integer) 2

127.0.0.1:6379> set cc1 aaa			# 设置为普通字符串
OK
127.0.0.1:6379> incr cc1			# 无法递增
(error) ERR value is not an integer or out of range

DECR key:key值递增减1(key值必须是整数)**

127.0.0.1:6379> decr cc1			# 递增减1
(integer) 101
127.0.0.1:6379> decr cc1
(integer) 100

127.0.0.1:6379> decr cc1			# 删除键内容
(integer) -1
127.0.0.1:6379> decr cc1			# 递增减1,删除后的键默认为空值,设定为0
(integer) -2

127.0.0.1:6379> set cc1 aaa			# 设置为普通字符串
OK
127.0.0.1:6379> decr cc1			# 无法递增
(error) ERR value is not an integer or out of range

INCRBY key 增加指定的整数

127.0.0.1:6379> get cc1					# 设定值
"100"
127.0.0.1:6379> incrby cc1 5			# 增加5
(integer) 105
127.0.0.1:6379> incrby cc1 5
(integer) 110

DECRBY key 减少指定的整数

127.0.0.1:6379> get cc1					# 设定值
"100"
127.0.0.1:6379> decrby cc1 5			# 减少5
(integer) 95
127.0.0.1:6379> decrby cc1 5
(integer) 90

1.4 GETSET

GETSET key value :获取key值并返回,同时给key设置新值

127.0.0.1:6379> set cc1 100
OK
127.0.0.1:6379> get cc1
"100"
127.0.0.1:6379> getset cc1 0		# 在获取原有值的同时,会设置新值,这两个操作原子性同时完成
"100"
127.0.0.1:6379> get cc1				# 查看结果
"0"

1.5 SETEX

setex key seconds value :设置指定key的过期时间为seconds

127.0.0.1:6379> setex cc1 10 nihao		# 设定过期时间为10秒
OK
127.0.0.1:6379> ttl cc1					# ttl命令查看剩余存活时间
(integer) 5
127.0.0.1:6379> get cc1					# 在存活时间内可以获取到内容
"nihao"
127.0.0.1:6379> ttl cc1
(integer) 3
127.0.0.1:6379> ttl cc1					# -2表示失效过期
(integer) -2
127.0.0.1:6379> get cc1					# 无内容
(nil)
127.0.0.1:6379> set cc1 nihao			# 直接设定为永久设定
OK
127.0.0.1:6379> ttl cc1					# -1代表一个上限,所有的意思
(integer) -1

1.6 SETNX

SETNX key value :不存在键的话执行set操作,存在就不执行

127.0.0.1:6379> setnx cc1 100			# 不存在的键执行成功
(integer) 1
127.0.0.1:6379> setnx cc1 200			# 存在后没有效果
(integer) 0
127.0.0.1:6379> get cc1					# 查看内容为第一次设置的值
"100"

1.7 MSET / MGET / MSETNX

MSET key1 value key2 value … :批量设置键值

127.0.0.1:6379> mset cc5 555 cc6 666
OK
127.0.0.1:6379> get cc5
"555"
127.0.0.1:6379> get cc6
"666"

==MGET key1 key2 :批量获取多个键值

127.0.0.1:6379> mget cc5 cc6
1) "555"
2) "666"

MSETNX key1 value key2 value :批量设置,不存在的执行成功,存在的执行失败

127.0.0.1:6379> msetnx cc6 666 cc7 777			# 批量设置cc6 cc7
(integer) 0
127.0.0.1:6379> mget cc6 cc7					# cc6本身存在,导致执行失败,所以cc7没有设置成功
1) "666"
2) (nil)

127.0.0.1:6379> msetnx cc8 888 cc7 777			# 都没有存在的直接成功
(integer) 1
127.0.0.1:6379> mget cc8 cc7
1) "888"
2) "777"

二、List 数据类型

2.1 概述

列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素

2.2 LPUSH / LPUSHX / LRANGE

LPUSH key value value… :在头部左侧依次插入列表元素

# cc1键不存在,命令会创建改建及与其关联的List,之后再把参数从左到右依次插入
127.0.0.1:6379> lpush cc1 a b c d
(integer) 4

LPUSHX key value :键必须存在才能执行,在头部插入元素值并返回列表元素数量

127.0.0.1:6379> lpushx cc2 a b c d			# cc2不存在,所以不会进行操作,返回值0
(integer) 0

127.0.0.1:6379> lpushx cc1 e				# cc1存在,插入成功,并且返回当前元素的数量
(integer) 5

LRANGE key start stop :取从位置索引start到位置索引stop的所有元素(以0开始)

127.0.0.1:6379> lrange cc1 0 -1		# 取全部元素,0表示第一个,-1表示最后一个
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange cc1 0 2		# 取从位置0开始到位置2结束的共3个元素
1) "d"
2) "c"
3) "b"

2.3 LPOP / LLEN

127.0.0.1:6379> lpush cc1 a b c d			# 创建
(integer) 4
127.0.0.1:6379> lpop cc1					# 移除并返回键的第一个元素,从右往左第一个
"d"
127.0.0.1:6379> llen cc1					# 获取剩余元素数量,此时只有三个
(integer) 3

2.4 LREM / LSET / LINDEX / LTRIM

LREM key count value :从头部开始删除count个值为value的元素,并返回实际删除数量

127.0.0.1:6379> lpush cc1 a b c d a b c d	# 新建参数
(integer) 8
127.0.0.1:6379> lrem cc1 2 a				# 删除两个值为a的元素,返回值是实际删除的数量
(integer) 2
127.0.0.1:6379> lrange cc1 0 -1				# 查看
1) "d"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"

LSET key index value :将索引值为index的元素值设置为新值value

127.0.0.1:6379> lset cc1 0 dd				# 将头部第1个元素设置为新值dd
OK
127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"

LINDEX key index :获取索引值为index的元素值

127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
127.0.0.1:6379> lindex cc1 3				# 查看索引值为3的值,也就是第四个
"d"

LTRIM key start stop :仅保留索引值start到stop的元素

127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
127.0.0.1:6379> ltrim cc1 1 3			# 只保留索引值13的元素,包含13
OK
127.0.0.1:6379> lrange cc1 0 -1
1) "c"
2) "b"
3) "d"

2.5 LINSERT

LINSERT key BEFORE | AFTER pivot value :在元素pivot的前面(左)或者后面(右)插入新元素value

127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> linsert cc1 before a aa				# 在a的前面插入新元素aa
(integer) 5
127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "c"
3) "b"
4) "aa"
5) "a"
127.0.0.1:6379> linsert cc1 after d dd				# 在d的后面插入新元素dd
(integer) 6
127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "dd"
3) "c"
4) "b"
5) "aa"
6) "a"

127.0.0.1:6379> linsert cc2 after a aa				# 在不存在的key插入新元素,操作失败,返回0
(integer) 0
127.0.0.1:6379> linsert cc1 after f ff				# 在已存在的key内插入不存在的元素之前或之后,操作失败,返回-1
(integer) -1

2.6 RPUSH / RPUSHX / RPOP / RPOPLPUSH

RPUSH key value value… :在列表的尾部依次插入value

127.0.0.1:6379> rpush cc1 a b c d		# 插入顺序是从右到左
(integer) 4
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"

RPUSHX key value :必须存在key才能执行,从value尾部插入,并返回元素数量

127.0.0.1:6379> rpushx cc2 a			# 不存在不执行,返回0
(integer) 0
127.0.0.1:6379> rpushx cc1 e			# 存在的键,正常执行
(integer) 5

RPOP key :在尾部移除一个元素,并且返回该元素

127.0.0.1:6379> rpop cc1				# 默认移除一个元素
"e"
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"

RPOPLPUSH source destination :在key1的尾部弹出一个元素并返回,将它插入到key2的头部

127.0.0.1:6379> rpoplpush cc1 cc2			# 弹出cc1的尾部元素,插入到cc2的头部
"d"
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lrange cc2 0 -1
1) "d"

127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpoplpush cc1 cc1			# 弹出cc1的尾部元素插入到cc1的头部
"c"
127.0.0.1:6379> lrange cc1 0 -1
1) "c"
2) "a"
3) "b"

三、Hash 数据类型(散列类型)

3.1 概述

hash用于存储对象。可以采用这样的命名方式:对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。 如:存储 ID 为 2 的汽车对象

如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对

3.2 HSET / HGET / HDEL / HEXISTS / HLEN / HSETNX

127.0.0.1:6379> hset cc1 field1 111				# 设置cc1键的字段field1的值为111
(integer) 1
127.0.0.1:6379> hget cc1 field1					# 查看cc1键字段field1的值
"111"
127.0.0.1:6379> hget cc1 field2					# 2未创建,返回nil
(nil)
127.0.0.1:6379> hset cc1 field2 222				# 创建字段field2
(integer) 1
127.0.0.1:6379> hlen cc1						# 获取cc1键的字段数量
(integer) 2
127.0.0.1:6379> hexists cc1 field1				# 判断键中是否存在字段为field1的字段,存在返回1
(integer) 1
127.0.0.1:6379> hdel cc1 field1					# 删除键中的字段
(integer) 1
127.0.0.1:6379> hsetnx cc1 field1 111			# 给cc1添加新字段,成功返回1
(integer) 1
127.0.0.1:6379> hsetnx cc1 field1 111			# 重复添加失败,返回0
(integer) 0

3.3 HINCRBY

127.0.0.1:6379> hset cc1 field 2			# 创建
(integer) 1
127.0.0.1:6379> hincrby cc1 field 1			# 给字段值加1,返回为加后的结果
(integer) 3
127.0.0.1:6379> hincrby cc1 field 1
(integer) 4
127.0.0.1:6379> hincrby cc1 field -2		# 给字段值减2,返回为减后的结果
(integer) 2
127.0.0.1:6379> hincrby cc1 field -2
(integer) 0

3.4 HGETALL / HKEYS / HVALS / HMGET / HMSET

127.0.0.1:6379> hmset cc1 field1 111 field2 222			# 批量创建多个字段
OK
127.0.0.1:6379> hmget cc1 field1 field2					# 批量获取多个字段
1) "111"
2) "222"
127.0.0.1:6379> hgetall cc1								# 返回所有字段和值
1) "field1"
2) "111"
3) "field2"
4) "222"
127.0.0.1:6379> hkeys cc1								# 仅获取键中所有字段的名
1) "field1"
2) "field2"
127.0.0.1:6379> hvals cc1								# 仅获取键中所有字段的值
1) "111"
2) "222"

四、SET 数据类型(无序集合)

4.1 概述

无序集合,元素类型为String类型,元素具有唯一性,不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算

应用范围

  • 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性
  • 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势

以上是关于Redis的几个数据类型,包含简单命令举列的主要内容,如果未能解决你的问题,请参考以下文章

深入剖析Redis系列:Redis数据结构与全局命令概述

解析Redis操作五大数据类型常用命令

使 PHP 代码更加简洁的几个小技巧

Redis 笔记 01:入门篇

Redis 学习 —— 数据类型及操作

关于echo的几个小命令,有了它 你已经成功了万分之一