简介

Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储,它还支持数据的备份,即master-slave模式的数据备份,同样Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

Redis支持的五大数据类型包括

String(字符串 用法: 键 值)

Hash(哈希 类似Java中的 map 用法: 键 键值对)

List(列表 用法:键 集合 可以重复)

Set(集合 用法:键 集合 不可以重复)

Zset(sorted set 有序集合 用法: 键 值 值)

String

#######################################################################
127.0.0.1:6379> append key1 "hello"			#如果key1不存在则新建字符串
(integer) 5
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> append key1 " world"		#追加字符串
(integer) 11
127.0.0.1:6379> get key1					#获取key的value
"hello world"
127.0.0.1:6379> strlen key1					#求字符串的长度
(integer) 11
#######################################################################
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views		#自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> decr views		#自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0		
127.0.0.1:6379> incrby views 10		#设置步长
(integer) 10
127.0.0.1:6379> decrby views 5
(integer) 5
#######################################################################
#getrange 截取字符串
127.0.0.1:6379> set key1 "hello,kuangshen"
OK
127.0.0.1:6379> getrange key1 0 3		#截取字符串[0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1		#获取全部字符串
"hello,kuangshen"
#setrange 替换字符串
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 xx		#替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
#######################################################################
# setex(set with expire) #设置过期时间
# setnx(set if not exist) #不存在设置
127.0.0.1:6379> setex key3 30 "hello"	#设置key3的时间30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 23
127.0.0.1:6379> setnx mykey "redis"		#如果mykey不存在创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
3) "mykey"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "MongoDB"	#如果mykey存在创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"

#######################################################################
mset
mget

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3	#同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> mget k1 k2 k3	#同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4	#msetnx原子性操作,要么都成功,要么一起失败
(integer) 0
127.0.0.1:6379> get k4
(nil)

# 对象
set user:1 {name:zhangsan,age:3} #设置一个user:1:对象值为json字符串来保存一个对象

#这里的key是一个巧妙的设计user:{id}:{filed}
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 12
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "12"

#######################################################################
getset #先get然后set

127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db Mongodb
"redis"
127.0.0.1:6379> get db
"Mongodb"

List

在redis里面,我们可以把list玩成栈、队列

#######################################################################
#lpush  左插入
#rpush  右插入
#lrange 通过区间获取值 
127.0.0.1:6379> lpush list one	
(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
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
#######################################################################
#lpop  左移除
#rpop  右移除
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list 
"three"
127.0.0.1:6379> rpop list
"right"
#######################################################################
#lindex
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1
"one"
#######################################################################
#llen
127.0.0.1:6379> lpush list one
(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> llen list
(integer) 3

#######################################################################
#trim 修剪
#lrem 移除
指定的值(精确匹配)
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"


#######################################################################
#trim 修剪
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "heelo1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "heelo1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> ltrim mylist 1 2		#通过下标进行截取
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "heelo1"
2) "hello2"
#######################################################################
rpoplpush #移除列表最后一个元素,并将其添加到新的列表中

127.0.0.1:6379> rpush list "hello"
(integer) 1
127.0.0.1:6379> rpush list hello2
(integer) 2
127.0.0.1:6379> rpush list hello3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hello2"
3) "hello3"
127.0.0.1:6379> rpoplpush list mylist
"hello3"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello3"
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hello2"


#######################################################################、
#lset 将列表中指定下标的值替换成另一个值,更新操作
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lset list 0 item		#如果存在则更新
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> lset list 1 other		#如果不存在则报错
(error) ERR index out of range

#######################################################################
#linsert 将某个具体的value插入到列表中的前面或者后面

127.0.0.1:6379> lpush list hello
(integer) 1
127.0.0.1:6379> lpush list world
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "world"
2) "hello"
127.0.0.1:6379> linsert list before world hello
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "world"
3) "hello"
127.0.0.1:6379> linsert list after world other
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "world"
3) "other"
4) "hello"

小结

  • 它实际上是一个链表,before after left right都可以插入值
  • 如果key不存在,创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有值,空链表也代表不存在
  • 在两边插入或者改动值,效率最高!中间元素效率偏低!

消息排队!消息队列 (Lpush Rpop),消息栈(Lpush Lpop)

set(集合)

set中的值是不能重复的

#######################################################################
#sadd set集合中添加元素
#smembers 查看指定set中所有值
#sismember判断某一个值是否在set中
127.0.0.1:6379> sadd set hello
(integer) 1
127.0.0.1:6379> sadd set kuangshen
(integer) 1
127.0.0.1:6379> sadd set big
(integer) 1
127.0.0.1:6379> smembers set
1) "kuangshen"
2) "big"
3) "hello"
127.0.0.1:6379> sismember set hello
(integer) 1

#######################################################################
127.0.0.1:6379> scard set #获取指定set中内容的元素个数!
(integer) 3

#######################################################################
#srem 移除set中的某个元素
127.0.0.1:6379> srem set hello
(integer) 1
127.0.0.1:6379> scard set
(integer) 2

#######################################################################
#set无需不重复集合。抽随机
127.0.0.1:6379> smembers set
1) "kuangshen"
2) "big"
127.0.0.1:6379> srandmember set
"big"
127.0.0.1:6379> srandmember set
"big"
127.0.0.1:6379> srandmember set
"kuangshen"

#######################################################################
#spop 删除指定的key(随机)
127.0.0.1:6379> SMEMBERS set
1) "kuangshen"
2) "big"
127.0.0.1:6379> spop set
"big"
127.0.0.1:6379> SMEMBERS set
1) "kuangshen"

#######################################################################
#将一个指定的值移动到另外一个set集合中
127.0.0.1:6379> sadd set1 hello
(integer) 1
127.0.0.1:6379> sadd set1 world
(integer) 1
127.0.0.1:6379> sadd set1 kuangshen
(integer) 1
127.0.0.1:6379> sadd set2 set2
(integer) 1
127.0.0.1:6379> smove set1 kuangshen set2
(integer) 0
127.0.0.1:6379> smove set1 set2 kuangshen
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "kuangshen"
2) "set2"
#######################################################################
#sdiff 差集
#sinter交集
#sunion并集
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key1 d
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sadd key2 f
(integer) 1
127.0.0.1:6379> sdiff key1 key2
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> sinter key1 key2
1) "d"
127.0.0.1:6379> sunion key1 key2
1) "a"
2) "e"
3) "f"
4) "d"
5) "b"
6) "c"

Hash

Map集合,key-Map集合,本质和String类型没有太大区别

#######################################################################
127.0.0.1:6379> hset myhash field1 kuangshen
(integer) 1		#set一个具体的key-value
127.0.0.1:6379> hget myhash field1 
"kuangshen"		#获取一个字段值
127.0.0.1:6379> hmset myhash num1 hello num2 world
OK				#同时set多个key-value
127.0.0.1:6379> hmget myhash num1 num2	#获取多个字段值
1) "hello"
2) "world"

127.0.0.1:6379> hgetall myhash #获取所有值
1) "field1"
2) "kuangshen"
3) "num1"
4) "hello"
5) "num2"

127.0.0.1:6379> hdel myhash field1 #删除指定值
(integer) 1
127.0.0.1:6379> 

#######################################################################
#hlen 获取哈希表的字段数量

127.0.0.1:6379> hmset hash num1 hello num2 world
OK
127.0.0.1:6379> hgetall hash
1) "num1"
2) "hello"
3) "num2"
4) "world"
127.0.0.1:6379> hlen hash
(integer) 2
#######################################################################
#hexists 判断hash中指定的字段是否存在
127.0.0.1:6379> hexists hash num1
(integer) 1
127.0.0.1:6379> HEXISTS hash num3
(integer) 0
#######################################################################
#hvals 获取所有的字段
#hkeys 获取所有的值
127.0.0.1:6379> hvals hash
1) "hello"
2) "world"
127.0.0.1:6379> hkeys hash
1) "num1"
2) "num2"
#######################################################################
#incrby decrby hsetnx
127.0.0.1:6379> hset hash num3 5
(integer) 1
127.0.0.1:6379> hincrby hash num3 1 #指定增量
(integer) 6
127.0.0.1:6379> hincrby hash num3 -1
(integer) 5

127.0.0.1:6379>  hsetnx hash num4 big	#如果存在则不可以设置
(integer) 0
127.0.0.1:6379> hsetnx hash num5 big	#如果不存在则可以设置
(integer) 1

hash变更数据user name age,尤其是用户信息类,经常变动信息!

hash更适合对象的存储,String更适合字符串存储

Zset(有序结合)

#######################################################################
#添加三个用户
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
127.0.0.1:6379> zrange zset 0 -1	#显示全部用户 从小到大
1) "one"
2) "two"
3) "three"
#######################################################################
zrangebyscore
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 kuangshen
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #显示所有用户并且附带value
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores	#显示工资小于2500员工的升序排列
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"
	
127.0.0.1:6379> zrevrange salary 0 -1	#从大到小排序
1) "zhangsan"
2) "kuangshen"


#######################################################################
#zren 移除
127.0.0.1:6379> zrange salary 0 -1
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "kuangshen"
2) "zhangsan"

127.0.0.1:6379> zcard salary	#获取有序集合中的个数
(integer) 2
#######################################################################
#zcount 获取指定区间的成员数量
127.0.0.1:6379> zadd set 1 hello
(integer) 1
127.0.0.1:6379> zadd set 2 world 3 kuangshen
(integer) 2
127.0.0.1:6379> zcount set 1 3
(integer) 3

其余的一些api,通过我们的学习,剩下的如果需要,请前往官方文档:[Commands | Redis](https://redis.io/commands/)