Redis篇之五大数据类型

1、五大数据类型

4.1、String(字符串)

String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

127.0.0.1:6379> set key1 redis # 设置值
OK
127.0.0.1:6379> get key1 # 获取值
"redis"
127.0.0.1:6379> APPEND key1 "hello" # 追加key1的字符串,如果当前的key不存在,则默认set该key
(integer) 10
127.0.0.1:6379> get key1
"redishello"
127.0.0.1:6379> STRLEN key1 # 获取当前key的字符串的长度
(integer) 10
127.0.0.1:6379> APPEND key1 ",redis is so intersting!"
(integer) 34
127.0.0.1:6379> STRLEN key1 # 获取当前key的字符长度
(integer) 34
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 加一
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> DECR views # 减一
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> type views # 获取该key的类型
string
127.0.0.1:6379> INCRBY views 5
(integer) 6
127.0.0.1:6379> get views
"6"
127.0.0.1:6379> INCRBY views 10 # 指定增加的步长
(integer) 16
127.0.0.1:6379> get views
"16
127.0.0.1:6379> DECRBY views 10 # 指定减少的步长
(integer) 6
127.0.0.1:6379> get views
"6"

# 操作key的值
127.0.0.1:6379> FLUSHDB # 清空当前库
OK
127.0.0.1:6379> set key1 "hello liangtl" # 设置key1的值
OK
127.0.0.1:6379> get key1 # 获取key1的值
"hello liangtl"
127.0.0.1:6379> GETRANGE key1 0 3 # 截取key1的指定字符:0,1,2,3(左闭右开)
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 # 截取key1的所有字符(java的substring)
"hello liangtl"
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 cb # 替换指定位置开始的字符(java的replace)
(integer) 7
127.0.0.1:6379> get key2
"acbdefg"

# SETEX(set with expire) 设置该键的过期时间
127.0.0.1:6379> SETEX key3 30 "hello"
OK
127.0.0.1:6379> ttl key3
(integer) 10
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> keys *
1) "key2"
2) "key1"

# SETNX(set with not exist) 不存在时设置该键的值,否则设置失败
127.0.0.1:6379> setnx key4 "redis"
(integer) 1
127.0.0.1:6379> get key4
"redis"
127.0.0.1:6379> SETNX key4 "mongoDB"
(integer) 0
127.0.0.1:6379> get key4
"redis"
127.0.0.1:6379> 

# 批量添加key:mset、mset
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 # 同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:6379> MGET k1 k2 k3 # 同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> MSETNX k1 v2 k4 v4 # 原子性,只会全部成功或者全部失败,所以get时为空
(integer) 0
127.0.0.1:6379> get k4
(nil)

# 对象
127.0.0.1:6379> set user:1 {name:zhangsan,age:3} 
OK
127.0.0.1:6379> keys *
1) "k1"
2) "user:1"
3) "k2"
4) "k3"
127.0.0.1:6379> get user:1
"{
    
    name:zhangsan,age:3}"
# 这里的key是一个巧妙的设计:user:{id}:{filed},这种设计在redis上看是完全OK的!
127.0.0.1:6379> MSET user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> KEYS *
1) "user:1:age"
2) "k1"
3) "user:1:name"
4) "k2"
5) "user:1"
6) "k3"
127.0.0.1:6379> get user:1:name
"zhangsan"

# getset 先获取值在设置值
127.0.0.1:6379> getset db reids # 如果该键没有值,则返回null,并且设置为新的值
(nil)
127.0.0.1:6379> get db
"reids"
127.0.0.1:6379> getset db mongodb # 如果有值,返回原来的值,并且设置新的值
"reids"
127.0.0.1:6379> get db
"mongodb"

List(列表)

List介绍:Redis列表是简单字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头或则尾
它的底层是一个双向链表,对两端操作的性能很高,通过索引下标操作中间节点的性能很差

# 往列表的头部Left/尾部Right插入元素
127.0.0.1:6379> lpush list one # 往名为list的列表中加入一个value:one,如果list不存在,则为新建操作。lpush为从左边插入,所以输出为倒叙,Rpush同理。
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 # 输出list中的所有元素
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> RPUSH list four # 从列表的尾部插入元素
(integer) 4
127.0.0.1:6379> lrange list 0 -1 # 输出
1) "three"
2) "two"
3) "one"
4) "four"

# 往列表的头部Left/尾部Right移除元素
127.0.0.1:6379> LPOP list # 移除列表第一个元素
"three"
127.0.0.1:6379> RPOP list # 移除列表最后一个元素
"four"
127.0.0.1:6379> LRANGE list 0 -1 # 输出列表中的元素
1) "two"
2) "one"

# 获取列表指定索引位置的值
127.0.0.1:6379> LINDEX list 0 # 获取索引位置为0的值
"two"
127.0.0.1:6379> LINDEX list 1 # 获取索引位置为1的值
"one"

# 获取列表长度
127.0.0.1:6379> LLEN list
(integer) 2
127.0.0.1:6379> LPUSH list five
(integer) 3
127.0.0.1:6379> LLEN list
(integer) 3
127.0.0.1:6379> 

# 移除列表中的指定元素
127.0.0.1:6379> LRANGE list 0 -1
1) "seven"
2) "six"
3) "two"
4) "five"
5) "two"
6) "one"
127.0.0.1:6379> LREM list 1 five # 移除一个five元素
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "seven"
2) "six"
3) "two"
4) "two"
5) "one"
127.0.0.1:6379> LREM list 2 two # 移除两个two元素
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "seven"
2) "six"
3) "one"

# 截取列表中的指定下标长度的元素
127.0.0.1:6379> LRANGE list 0 -1
1) "four"
2) "three"
3) "two"
4) "seven"
5) "six"
6) "one"
127.0.0.1:6379> LTRIM list 1 3 # 截取list中索引从[1,3)
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "seven"

# 移除就列表中的一个元素并且将这个被移除的元素加入新的列表
127.0.0.1:6379> keys *
1) "list"
2) "list1"
127.0.0.1:6379> RPOPLPUSH list list2 #将list中的最后一个元素移除,并且将这个被移除的元素加入list2,如果list2不存在则新增list2
"seven"
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> LRANGE list2 0 -1
1) "seven"

# 更新列表中指定位置的value
127.0.0.1:6379> EXISTS list # 判断list是否存在,存在返回1不存在返回0
(integer) 1
127.0.0.1:6379> LSET list 0 three2 # 将list中的第一个元素设置为three2
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "three2"
2) "two"
127.0.0.1:6379> LSET list 3 haha # 如果下标不存在,则会报错
(error) ERR index out of range

# 插入一个值到列表的某个value的前面或者后面
127.0.0.1:6379> LRANGE list 0 -1
1) "three2"
2) "two"
127.0.0.1:6379> LINSERT list before two one # 往list中第一个值为two的元素前面插入一个值为one的元素
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "three2"
2) "one"
3) "two"

Set(集合)

Set介绍:set对外提供的功能与list类似是一个列表的功能。特殊在于set可以自动排重。当需要保存一个list数据时,又不希望list里的元素重复时,则set是一个很好的选择;并且set提供了判断某个成员是否在set中的一个接口,这是list不能提供的。
Redis的set是String类型的无序集合,它的底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都为O(1)

127.0.0.1:6379> FLUSHDB # 清空当前数据库
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SADD set1 one two three four # 新增一个set1,放入后面这四个值
(integer) 4
127.0.0.1:6379> SMEMBERS set1 # 获取set1中的所有元素
1) "four"
2) "three"
3) "one"
4) "two"
127.0.0.1:6379> SISMEMBER set1 one # 判断set1中是否存在one这个元素
(integer) 1
127.0.0.1:6379> SISMEMBER set1 five
(integer) 0
127.0.0.1:6379> SADD set1 one # 往set1中插入一个重复的值,不会报错,但是也不会插入,set是一个不重复的无序集合
(integer) 0
127.0.0.1:6379> SMEMBERS set1
1) "four"
2) "three"
3) "one"
4) "two"
127.0.0.1:6379> SREM set1 four # 删除set1中的four元素
(integer) 1
127.0.0.1:6379> SMEMBERS set1 five # 判断five元素是否是set1的成员
(integer) 1

# 随机抽取或者删除set中的一个或多个元素
127.0.0.1:6379> SADD set2 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> SRANDMEMBER set2 # 随机抽取set2中的一个元素
"3"
127.0.0.1:6379> SRANDMEMBER set2 2 # 随机抽取set2中的两个元素
1) "4"
2) "6"
127.0.0.1:6379> SPOP set2 # 随机删除set2中的一个元素
"3"
127.0.0.1:6379> SPOP set2 2 # 随机删除set2中的两个元素
1) "2"
2) "6"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "4"
3) "5"
4) "7"
5) "8"
6) "9"

# 将一个set中的值移动至另一个set中
127.0.0.1:6379> SMEMBERS set1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "4"
3) "5"
4) "7"
5) "8"
6) "9"
127.0.0.1:6379> SMOVE set1 set2 three
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "two"
2) "one"
127.0.0.1:6379> SMEMBERS set2
1) "8"
2) "7"
3) "5"
4) "4"
5) "three"
6) "9"
7) "1"

# 取两个或两个以上set集合的交集、并集、差集(此处以两个为例)
127.0.0.1:6379> SADD set3 a b c # 新增set3
(integer) 3
127.0.0.1:6379> SADD set4 c d e # 新增set4
(integer) 3
127.0.0.1:6379> SDIFF set3 set4 # 以set3为主,取set3和set4的差集
1) "a"
2) "b"
127.0.0.1:6379> SINTER set3 set4 # 取set3、set4的交集
1) "c"
127.0.0.1:6379> SUNION set3 set4 # 取set3、set4的并集
1) "c"
2) "b"
3) "d"
4) "e"
5) "a"

闲聊时间

多聊一嘴,其实这些命令都可以在英语单词中找到一些规律
把SDIFF、SINTER还有SUNION这三个单词首字母去掉,可以得到
DIFF:different,它代表不同的,用一句Redis官网的翻译来描述:返回的集合元素是第一个key的集合与后面所有key的集合的差集
INTER:intersection,翻译过来为交叉,同样的,意指数学关系中的交集
UNION:union,翻译为联合,与数学关系中的并集也是可以沾边的

Hash(哈希)

Hash介绍:hash是一个键值对集合
Redis hash是一个string类型的field和value的映射表,hash最适合用来存储对象。类似java里面的Map<String,Object>

127.0.0.1:6379> HSET hash1 age 23 name tl high 178 # 新建hash1,并且以键值对的形式存储后面的这些值
(integer) 3
127.0.0.1:6379> HLEN hash1 # 获取hash1的长度
(integer) 3
127.0.0.1:6379> HEXISTS hash1 name # 判断hash1是否存在键name
(integer) 1
127.0.0.1:6379> HEXISTS hash1 weight
(integer) 0
127.0.0.1:6379> HGETALL hash1 # 获取hash1中的所有键和值
1) "age"
2) "23"
3) "name"
4) "tl"
5) "high"
6) "178"
127.0.0.1:6379> HKEYS hash1 # 获取hash1中的所有键
1) "age"
2) "name"
3) "high"
127.0.0.1:6379> HVALS hash1 # 获取hash1中的所有值
1) "23"
2) "tl"
3) "178"
127.0.0.1:6379> HINCRBY hash1 age 2 # 将hash1中的age对应的value+2
(integer) 25
127.0.0.1:6379> HGET hash1 age # 获取hash1中age对应的值
"25"
127.0.0.1:6379> HINCRBY hash1 age -2  # 将hash1中的age对应的value-2
(integer) 23
127.0.0.1:6379> HGET hash1 age # 获取hash1中age对应的值
"23"
127.0.0.1:6379> HSETNX hash1 name haha # 如果键name不存在则新增,存在则返回0,不对原值做变动
(integer) 0
127.0.0.1:6379> HSETNX hash1 add jx
(integer) 1
127.0.0.1:6379> HGETALL hash1
1) "age"
2) "23"
3) "name"
4) "tl"
5) "high"
6) "178"
7) "add"
8) "jx"

Zset(有序集合)

Zset介绍:Zset是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。

因为元素是有序的,所以你也可以很快的根据评分( score )或者次序( position )来获取一个范围的元素。

访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

127.0.0.1:6379> ZADD zset 1 one 3 three 7 four 2 two 5 five # 新增zset1,并添加后面跟随的键值
(integer) 5
127.0.0.1:6379> ZREVRANGEBYSCORE zset -inf +inf
(empty array)
127.0.0.1:6379> ZRANGE zset 0 -1
1) "one"
2) "two"
3) "three"
4) "five"
5) "four"
127.0.0.1:6379> ZADD zset1 1 one 2 two 3 three 4 four # 新增zset1,并添加后面跟随的键值
(integer) 4
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
127.0.0.1:6379> ZADD zset1 5 five # 给zset新增值
(integer) 1
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
# -inf:负无穷 +inf:正无穷 score:每个元素value被赋予的一个权重值
127.0.0.1:6379> ZRANGEBYSCORE zset1 -inf +inf # 根据score从小到大排序输出
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
127.0.0.1:6379> ZRANGEBYSCORE zset1 0 2 # 从小到大输出权重在[0,2]之间的值
1) "one"
2) "two"
127.0.0.1:6379> ZREVRANGE zset1 1 3
1) "four"
2) "three"
3) "two"
127.0.0.1:6379> ZRANGEBYSCORE zset1 -inf +inf withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"
127.0.0.1:6379> ZCOUNT zset 2 5 # 统计zset中权重值为2-5之间的个数
(integer) 3
127.0.0.1:6379> ZRANK zset five # 输出zset中five元素对应的排名(从0开始)
(integer) 3

猜你喜欢

转载自blog.csdn.net/weixin_46508271/article/details/129947448