2.6_4 Reids数据类型 + 基础命令

相关链接



一、五大数据类型

在这里插入图片描述
全段翻译:
  Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件MQ。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了主从复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

P.S 在SpringBoot和Jedis(java操作Redis的的客户端)中使用的也是这些命令。
P.S

遇到不会的命令,可以在官网查看帮助文档,这里整理的只是部分常用命令,并不是全部命令

在这里插入图片描述

遇到记不清的指令又不想查文档,可以尝试tab自动补全

想查看过期剩余时间(ttl),只记得tt,想不起来是tt啥来的,就可以按下tab
在这里插入图片描述
自动补全
在这里插入图片描述


1.1 Redis-Key

1.基本Key操作:set、get、keys、exists、move、expire、ttl、type
2.复合型key操作:setex、setnx
3.批量key操作:mset、mget、msetnx
4.getset操作:getset


1.1.1 基本key操作

1.基本Key操作:set、get、del、keys、exists、move、expire(【单点登录】设置过期)、ttl、type

# set		# 设置值
# get		# 获取值
# keys		# 获取key【支持正则】
# exists	# 判断某一个key是否存在
# move		# 移动到另一个db
# expire	# 设置过期 (单点登录=>使用的就是expire)
# ttl		# 查看过期剩余时间,单位是秒
# type		# 查看key的类型

127.0.0.1:6379> set name Groupies # set key
OK
127.0.0.1:6379> set age 18 # set key
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> EXISTS name # 判断当前key是否存在
(integer) 1
127.0.0.1:6379> EXISTS name1
(integer) 0
127.0.0.1:6379> move name 1 # 移动当前key到另一个db
(integer) 1
127.0.0.1:6379> EXISTS name 
(integer) 0
127.0.0.1:6379> set name m
OK
127.0.0.1:6379> expire name 10 # 设置过期时间,单位是秒
(integer) 1					   #(可用于cookie、session信息、单点登录 将一些数据放入Redis)
127.0.0.1:6379> ttl name # 查看指定key的剩余时间
(integer) 8
127.0.0.1:6379> ttl name
(integer) 5
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name mm
OK
127.0.0.1:6379> type name # 查看key的数据类型
string
127.0.0.1:6379> type age # 查看key的数据类型
string
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> get name
"Groupies"
127.0.0.1:6379[1]> 

1.1.2 复合型key操作

2.复合型key操作:setex、setnx

############################# 合并指令 #############################################
# setex(set with expire)  # 设置过期时间  => expire 也能设置过期时间,但setex是set + expire 
# setnx(set if not exist) # 不存在再设置key(在分布式锁中,会经常使用)

127.0.0.1:6379> flushdb		# 清空当前数据库
OK
127.0.0.1:6379> set key1 v1 # 设置值
OK
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> setex key2 30 hello # 设置key2的值为:hello,30秒后过期
OK
127.0.0.1:6379> ttl key2	# 剩余时间,单位是秒
(integer) 26
127.0.0.1:6379> get key2
"hello"
127.0.0.1:6379> setnx mykey redis # 如果不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "mykey"
3) "key1"
127.0.0.1:6379> ttl key2
(integer) -2
127.0.0.1:6379> keys *
1) "mykey"
2) "key1"
127.0.0.1:6379> setnx mykey "mongodb" # 如果mykey存在,创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> 

1.1.3 批量key操作

3.批量key操作:mset、mget、msetnx

############################# 批量key操作 #######################################
# mset 		# 批量设置值 
# mget		# 批量获取值
# del		# 批量删除值
# msetnx 	# 批量设置值(如果不存在就创建),msetnx = mset + setnx
			# msetnx 属于原子操作,全部不存在才创建,其中任意一个key存在都不会创建
			
127.0.0.1:6379> flushdb				   # 清空当前数据库
OK
127.0.0.1:6379> mset k1 v1 k1 v10 k3 v3 # 同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
127.0.0.1:6379> get k1			# 这里k1设置了两次,表示第2次的值v2覆盖了第一次的值v1
"v10"				
127.0.0.1:6379> mget k1 k2 k3	# 同时获取多个值
1) "v10"
2) (nil)		# 不存在返回(nil)
3) "v3"
127.0.0.1:6379> msetnx k1 v10 k2 v20 k3 v30 k4 v40 # msetnx是一个原子性的操作,要么一起成功,要么一起失败
(integer) 0								# 返回0表示设置失败
127.0.0.1:6379> msetnx k2 v20 k4 v40	
(integer) 1								# 返回1表示设置成功
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v10"
2) "v20"
3) "v3"
4) "v40"
127.0.0.1:6379> del k1 k2 k3		# 批量删除
(integer) 3
127.0.0.1:6379> mget k1 k2 k3 k4
1) (nil)
2) (nil)
3) (nil)
4) "v40"

1.1.4 getset

4.getset操作:getset

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

127.0.0.1:6379> flushdb			# 清空当前数据库
OK
127.0.0.1:6379> getset db redis	# 如果不存在值,则返回 nil
(nil)
127.0.0.1:6379> getset db mongodb # 如果存在值,则返回原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"

1.2 Strings 字符串

String命令
1. String类的value除了是字符串,还可以是数字
特点:key可以重复设置,新的value会覆盖旧的
应用:自增功能可以用来做计数器、文章浏览量

1.字符串基础操作:append、strlen、substr
2.自增(文章浏览量):incr、decr、incrby、decrby
3.字符串截取-按范围:getrange、setrange
4.json型字符串:没有新的指令,只是mset、mget的一种用法


1.2.1 字符串基础操作

String命令

1.字符串基础操作:append、strlen、substr

############################## 字符串基础操作 #######################################
# append	# 追加字符串,如果当前key不存在,就相当于set key
# strlen	# 获取字符串长度
# substr	# 截取字符串

127.0.0.1:6379> flushdb			# 清空当前数据库
OK
127.0.0.1:6379> set key1 v1 # 设置值
OK
127.0.0.1:6379> get key1    # 获取值
"v1"
127.0.0.1:6379> keys *      # 获得所有的key
1) "key1"
127.0.0.1:6379> exists key1 # 判断某一个key是否存在
(integer) 1
127.0.0.1:6379> append key1 hello,Groupies # 追加字符串,如果当前key不存在,就相当于set key
(integer) 16
127.0.0.1:6379> get key1
"v1hello,Groupies"
127.0.0.1:6379> strlen key1 #获取字符串长度
(integer) 16
127.0.0.1:6379> substr key1 1 10 # 截取字符串
"1hello,Gro"

1.2.2 自增(文章浏览量)

2.自增(文章浏览量):incr、decr、incrby、decrby

############################### 自增(文章浏览量) ##########################################
# incr    # i++
# decr	  # i--
# incrby  # 指定步长增 i+=
# decrby  # 指定步长减 i-=

127.0.0.1:6379> flushdb			# 清空当前数据库
OK
127.0.0.1:6379> set views 0 # 初始浏览量为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 自增1 浏览量+1
(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 # 自减1 浏览量-1
(integer) 1
127.0.0.1:6379> incrby views 10 # 可以设置步长,指定增量
(integer) 11
127.0.0.1:6379> incrby views 10
(integer) 21
127.0.0.1:6379> decrby views 5
(integer) 16

1.2.3 字符串截取-按范围

3.字符串截取-按范围:getrange、setrange

############################ 字符串截取-按范围 #####################################
# getrange # 不会改变key原内容(substr会替换原有key内容)
# setrange # 替换,会改变key原有内容

127.0.0.1:6379> flushdb			# 清空当前数据库
OK
127.0.0.1:6379> set key1 "hello,Groupies" # 设置值
OK
127.0.0.1:6379> getrange key1 3 4	# 截取字符串 [0,3]
"lo"
127.0.0.1:6379> getrange key1 3 -1	# 截取字符串,-1表示取到字符串结尾
"lo,Groupies"
127.0.0.1:6379> get key1
"hello,Groupies"
127.0.0.1:6379> setrange key1 1 xxx
(integer) 14
127.0.0.1:6379> get key1
"hxxxo,Groupies"
127.0.0.1:6379> 

1.2.4 json型字符串

4.json型字符串:没有新的指令,只是mset、mget的一种用法

############################# json型字符串 #######################################
# 对象 
set user:1{name:zhangsan,age:3} # 设置一个user:1 对象 值为 json字符来保存一个对象
-----------------------------------
127.0.0.1:6379> flushdb			# 清空当前数据库
OK
# 这里的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> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
127.0.0.1:6379> 

1.3 List 列表

List命令
1. 所有list命令都是用L开头的,Redis命令不区分大小写
2. 基本的数据类型,列表。在 Reids 里面,可以把List玩成 => 队列阻塞队列
在这里插入图片描述
应用:做消息队列(Lpush、Rpop);做栈(Lpush、Lpop)

1.压栈(push)、获取-按索引范围操作:Lpush、Rpush
2.出栈(pop):Lpop、Rpop
3.获取 - 按索引:Lindex、Lrange
4.获取长度:Llen
5.移除-按value:Lrem
6.移除-按索引范围:trim
7.组合命令:RpopLpush (RpopLpush=Rpop+Lpush)
8.更新:Lset
9.插入:Linsert before、Linsert after
 List实际上是一个链表,before,after,left,right 都可以插入值
  1) 如果key不存在,创建新的链表。
  2) 如果key存在,新增内容。
  3) 如果移除所有的值,空链表 ,也代表不存在。
  4) 在两边插入或者改动值,效率最高!中间元素,相对来说效率低一点。


1.3.1 压栈(push)

1.压栈(push)操作:Lpush、Rpush

############################# 压栈(push)、获取-按索引范围 #######################################
# Lpush		# 将一个值或者多个值,插入到列表头部(左)
# Rpush		# 将一个值或者多个值,插入到列表尾部(右)

127.0.0.1:6379> flushdb			# 清空当前数据库
OK
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 # 获取list中的值
1) "three"	# 头(左)
2) "two"
3) "one"	# 尾(右)
127.0.0.1:6379> lrange list 0 1	# 通过区间获取具体的值
1) "three"	# 头(左)
2) "two"	# 尾(右)
127.0.0.1:6379> rpush list right
(integer) 4
127.0.0.1:6379> lrange list 0 -1 # 将一个或者多个值,插入到列表尾部(右)
1) "three"	# 头(左)
2) "two"
3) "one"
4) "right"	# 尾(右)

1.3.2 出栈(pop)

2.出栈(pop)操作:Lpop、Rpop

############################# 出栈(pop) #####################################
# Lpop 	# 从列表头部移除(左)移除n个元素,不指定n时 n=1
# Rpop 	# 从列表尾部操作(右)移除n个元素,不指定n时 n=1

127.0.0.1:6379> flushdb				# 清空当前数据库
OK
127.0.0.1:6379> lpush list 1 2 3 4 5 6	# 将多个值,插入列表头部(左)
(integer) 6
127.0.0.1:6379> lrange list 0 -1	# 获取指定list,从索引0到结尾-1
1) "6"	# 头(左)
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"	# 尾(右)
127.0.0.1:6379> lpop list			# 从列表头部移除(左)移除n个元素,不指定n时 n=1
"6"
127.0.0.1:6379> rpop list			# 从列表尾部移除(→)移除n个元素,不指定n时 n=1
"1"
127.0.0.1:6379> lrange list 0 -1	# 获取指定list,从索引0到结尾-1
1) "5"	# 头(左)
2) "4"
3) "3"
4) "2"	# 尾(右)
127.0.0.1:6379> lpop list 2			# 从列表头部移除(左)移除2个元素
1) "5"
2) "4"
127.0.0.1:6379> lrange list 0 -1	# 获取指定list,从索引0到结尾-1
1) "3"
2) "2"

1.3.3 获取 - 按索引

3.获取 - 按索引:Lindex、Lrange

############################# 获取-按索引 #######################################
# Lindex	# 通过索引,获取list中的某一个值
# Lrange 	# 通过索引区间,获取list范围内所有值

127.0.0.1:6379> flushdb				# 清空当前数据库
OK
127.0.0.1:6379> lpush list one two	# 将多个值,插入列表头部(左)
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 0	# 通过索引,获取list中的某一个值
"two"
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> lindex list 2
(nil)
127.0.0.1:6379> lrange list 0 -1 # 获取list中的值
1) "three"	# 头(左)
2) "two"
3) "one"	# 尾(右)
127.0.0.1:6379> lrange list 0 1	# 通过索引区间,获取list范围内所有值
1) "three"	# 头(左)
2) "two"	# 尾(右)

1.3.4 获取长度

4.获取长度:Llen

############################# 数组操作2-get Length #####################################
# Llen	# 获取list的长度

127.0.0.1:6379> flushdb		# 清空当前数据库
OK
127.0.0.1:6379> lpush list 1 2 3
(integer) 3
127.0.0.1:6379> llen list	# 获取list长度
(integer) 3

1.3.5 移除-按value

5.移除操作-按value:Lrem

############################# 删除-按value #######################################
通过uid
# Lrem 	# 从列表头部移除指定个数的value,精确匹配。(rem = remove的缩写)
127.0.0.1:6379> flushdb		# 清空当前数据库
OK
127.0.0.1:6379> lrem list 1 one
(integer) 0
127.0.0.1:6379> lpush list one two three three 3 three three
(integer) 7
127.0.0.1:6379> lrange list 0 -1	
1) "three"
2) "three"
3) "3"
4) "three"
5) "three"
6) "two"
7) "one"
127.0.0.1:6379> lrem list 1 one	# 从左侧移除一个 one
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "3"
4) "three"
5) "three"
6) "two"
127.0.0.1:6379> lrem list 1 three # 从左侧移除一个 three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "3"
3) "three"
4) "three"
5) "two"
127.0.0.1:6379> lrem list 2 three # 从左侧移除两个 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three	# 剩余个数不足时,有几个就移除几个
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "two"

1.3.6 移除-按索引范围

6.移除操作-按索引范围:trim

############################### 删除-按范围 ######################################
# trim 	# 修剪
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(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> ltrim mylist 1 2	# 通过下标截取指定的长度,这个list已经被改变了,阶段了只剩下截取的元素
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"

1.3.7 组合命令

7.组合命令:RpopLpush (RpopLpush=Rpop+Lpush)

############################### 组合命令 ######################################
# RpopLpush # 移除列表的最后一个元素,并将他移动到新的列表中 (RpopLpush=Rpop+Lpush)
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist newlist	# 移除mylist尾部元素,添加到newlist的头部
"hello2"
127.0.0.1:6379> lrange mylist 0 -1	# 查看原来的列表
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange newlist 0 -1	# 查看目标列表中,确实存在该值
1) "hello2"
127.0.0.1:6379> rpoplpush mylist mylist
"hello1"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello"

1.3.8 更新

8.更新:Lset

############################### update ######################################
# Lset # 将列表中指下标的值替换为另外一个值
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> exists list	# 是否存在list
(integer) 0					# 0=不存在 1=存在
127.0.0.1:6379> lset list 0 item
(error) ERR no such key
127.0.0.1:6379> lpush list value
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "value"
127.0.0.1:6379> lset list 0 item
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"

1.3.9 插入

9.插入:Linsert before、Linsert after

############################### insert ######################################
# Linsert before	# 将某个具体的value,插入到列表中指定元素之前(如果存在多个相同元素,插入到匹配到的第一个元素之前)
# Linsert after		# 将某个具体的value,插入到列表中指定元素之后

127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> rpush mylist a b a
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "a"
127.0.0.1:6379> linsert mylist before a c
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "a"
3) "b"
4) "a"

1.4 Set 集合

Set命令
1. 所有set命令都是用S开头的,Redis命令不区分大小写
2. 特点:set中的值是不能重复的,Sadd批量插入值时,其中重复的值会失败(返回累计0),不重复的值会成功(返回累计1)
3. 应用:集合可以用来做微博的a用户、b用户共同关注、共同粉丝、二度好友等功能

1.插入、获取所有:Sadd、Sismember
2.查找-按value:Sismember
3.获取长度:Scard
4.移除-按value:Srem
5.抽随机数(n个):Srandmember
6.移动:Smove
7.集合:Sinter、Sunion、Sdiff


1.4.1 插入、获取所有

1.插入、获取所有:Sadd、Smembers

############################### 插入、获取 ######################################
# Sadd		# 将一个值或者多个值,插入到set集合,set集合value不能够重复
# Smembers	# 获取指定set所有值

127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> sadd myset hello world redis	#将多个值插入到set集合
(integer) 3
127.0.0.1:6379> smembers myset 		
1) "redis"
2) "hello"
3) "world"
127.0.0.1:6379> sadd myset hello
(integer) 0
127.0.0.1:6379> smembers myset
1) "redis"
2) "hello"
3) "world"

1.4.2 获取-按value

2.获取-按value:Sismember

############################### 查找-按value ######################################
# Sismember # 判断Set集合中是否包含指定元素,返回1=存在 0=不存在

127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> sadd myset hello world redis	#将多个值插入到set集合
(integer) 3
127.0.0.1:6379> smembers myset 		
1) "redis"
2) "hello"
3) "world"
127.0.0.1:6379> sismember myset hello	# 判断Set集合中是否包含hello元素
(integer) 1								# 返回1表示存在
127.0.0.1:6379> sismember myset hi
(integer) 0								# 返回0表示不存在

1.4.3 获取长度

3.获取长度:Scard

############################### 获取长度 ######################################
# Scard # 获取Set集合长度

127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> sadd myset hello world redis	#将多个值插入到set集合
(integer) 3
127.0.0.1:6379> scard myset
(integer) 3

1.4.4 移除-按value

4.移除-按value:Srem

############################### 查找-按value ######################################
# Srem # 移除Set集合中指定value元素,返回1=移除成功,返回0=移除失败(value不存在)

127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> sadd myset hello world redis	#将多个值插入到set集合
(integer) 3
127.0.0.1:6379> smembers myset	# 获取指定set所有值
1) "redis"
2) "hello"
3) "world"
127.0.0.1:6379> srem myset redis	# 移除指定元素
(integer) 1							# 移除成功返回1
127.0.0.1:6379> srem myset hi
(integer) 0							# 移除失败返回0(value不存在)
127.0.0.1:6379> smembers myset	# 获取指定set所有值
1) "hello"
2) "world"

1.4.5 抽随机数(n个)

5.抽随机数(n个):Srandmember

############################### 抽随机数(n个) ######################################
# Srandmember # 从Set集合中随即获取n个元素,设set长度为m则
	# 当n不指定时,n=1
	# 当n>m时,只能获取m个,
	# 当n=0时,返回空(empty array)
	# 当n<0时,获取|n|个随机值
	
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> sadd myset hello world redis	#将多个值插入到set集合
(integer) 3
127.0.0.1:6379> smembers myset	# 获取指定set所有值
1) "redis"
2) "hello"
3) "world"
127.0.0.1:6379> SRANDMEMBER myset	# 从Set集合中随即获取1个元素
"hello"
127.0.0.1:6379> SRANDMEMBER myset 1	# 从Set集合中随即获取1个元素
1) "hello"
127.0.0.1:6379> SRANDMEMBER myset 1	# 从Set集合中随即获取1个元素
1) "world"
127.0.0.1:6379> SRANDMEMBER myset 2	# 从Set集合中随即获取2个元素
1) "hello"
2) "reids"
127.0.0.1:6379> SRANDMEMBER myset 2	# 从Set集合中随即获取2个元素
1) "hello"
2) "world"
127.0.0.1:6379> SRANDMEMBER myset 4	# 当n大于set长度(m)时只能获取m个
1) "reids"
2) "hello"
3) "world"
127.0.0.1:6379> SRANDMEMBER myset 0	# 当n等于0时返回空(empty array)
(empty array)
127.0.0.1:6379> SRANDMEMBER myset -4	# 当n小于0时,获取|n|个随机值
1) "hello"
2) "hello"
3) "world"
4) "world"

1.4.6 移动

6.移动:Smove

############################### 移动 ######################################
# Smove # 从Set集合中将指定元素从a集合移动到b集合中,返回1=成功,0=失败(value不存在)
	
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> sadd myset hello world redis	# 将多个值插入到set集合
(integer) 3
127.0.0.1:6379> sadd myset2 java	# 将1个值插入到set集合
(integer) 1
127.0.0.1:6379> smove myset myset2 hello	# 将hello集合从myset集合中移动到myset2集合中
(integer) 1							# 返回1=成功
127.0.0.1:6379> smembers myset		# 获取指定set所有值
1) "redis"
2) "world"
127.0.0.1:6379> smembers myset2		# 获取指定set所有值
1) "hello"
2) "java"
127.0.0.1:6379> smove myset myset2 hi	
(integer) 0							# 返回0=失败(value不存在)

1.4.7 集合(共同关注)

7.集合:Sinter、Sunion、Sdiff

可以用来做微博的a用户、b用户共同关注、共同粉丝、二度好友等功能

############################### 集合 ######################################
# Sinter 	# 返回两个Set集合交集
# Sunion	# 返回两个Set集合的并集
# Sdiff 	# 返回两个Set集合的差集,与参数的先后顺序有关

127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> sadd key1 a b c	# key1 Set集合添加元素a b c
(integer) 3
127.0.0.1:6379> sadd key2 c d e	# key2 Set集合添加元素c d e
(integer) 3
127.0.0.1:6379> sinter key1 key2	# 获取并集
1) "c"
127.0.0.1:6379> sunion key1 key2	# 获取并集
1) "a"
2) "c"
3) "b"
4) "d"
5) "e"
127.0.0.1:6379> sdiff key1 key2	# 获取差集
1) "a"
2) "b"
127.0.0.1:6379> sdiff key2 key1	# 获取差集
1) "d"
2) "e"

1.5 Zset 有序集合

Sorted_Set命令
1. 所有Zset命令都是用Z开头的,Redis命令不区分大小写
2. 在set的基础上(k和v之间),增加了一个分数(排序字段)。
特点:在zset的值不能重复(和set一样)。
应用:存储班级成绩、工资表排序、消息加权重、排行榜功能。

1.插入:Zadd
2.获取 - 按索引:Zrange
3.获取 - 按分数范围(正序、倒序):Zrangebyscore、Zrevrangebyscore
4.获取长度:Zcard
5.移除-按value:Zrem


1.5.1 插入

1.插入:Zadd

############################### 插入、获取 ######################################
# Zadd		# 将一个值或者多个值,插入到zset集合,zset集合value不能够重复

127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> zadd myzset 1 hello	# 将值插入到set集合
(integer) 1
127.0.0.1:6379> zadd myzset 2 world 3 redis	# 将多个值插入到set集合
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "hello"
2) "world"
3) "redis"
127.0.0.1:6379> zadd myzset 4 hello	# Zset值不能重复
(integer) 0

1.5.2 获取 - 按索引

2.获取 - 按索引:Zrange

############################### 获取 - 按索引 ######################################
# Zrange		# 获取指定索引范围的所有value
				
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> zadd zsalary 500 zhangsan
(integer) 1
127.0.0.1:6379> zadd zsalary 1000 zhaosi
(integer) 1
127.0.0.1:6379> zadd zsalary 1500 wangwu
(integer) 1
127.0.0.1:6379> zrange zsalary 0 -1	# 获取指定索引范围的所有value
1) "zhangsan"
2) "zhaosi"
3) "wangwu"

1.5.3 获取 - 按分数(正序、倒序)

3.获取 - 按分数范围(正序、倒序):Zrangebyscore、Zrevrangebyscore

############################### 获取 - 按分数(正序、倒序) ######################################
# Zrangebyscore	# 获取指定分数(score)范围内所有的value - 正序
				# Zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
				# 中括号中的参数[] 表示非必填
				# min 可以是 -inf 表示 infinity 负无穷(-∞)
				# max 可以是 +inf 表示 infinity 正无穷(+∞)
				# [WITHSCORES] 表示
				# [LIMIT offset count]表示 从索引offset开始取,取count个
# Zrevrangebyscore	# 获取指定分数(score)范围内所有的value	- 倒序			
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> zadd zsalary 500 zhangsan
(integer) 1
127.0.0.1:6379> zadd zsalary 1000 zhaosi
(integer) 1
127.0.0.1:6379> zadd zsalary 1500 wangwu
(integer) 1
127.0.0.1:6379> zrangebyscore zsalary -inf +inf	# 按分数范围取值 (负无穷到正无穷) - 正序
1) "zhangsan"
2) "zhaosi"
3) "wangwu"
127.0.0.1:6379> 127.0.0.1:6379> zrevrangebyscore zsalary +inf -inf	# 按分数范围取值 (正无穷到负无穷) - 倒序
1) "wangwu"
2) "zhaosi"
3) "zhangsan"	
127.0.0.1:6379> zrangebyscore zsalary -inf 1000 withscores # (显示分数)分数大于小于1000的员工 - 正序
1) "zhangsan"
2) "500"
3) "zhaosi"
4) "1000"
5) "wangwu"
6) "1500"
127.0.0.1:6379> zrangebyscore zsalary -inf +inf withscores limit 0 1	# 从索引0开始取,取1个 - 正序
1) "zhangsan"
2) "500"
127.0.0.1:6379> zrangebyscore zsalary -inf +inf withscores limit 1 2	# 从索引1开始取,取2个 - 正序
1) "zhaosi"
2) "1000"
3) "wangwu"
4) "1500"

1.5.4 获取长度

4.获取长度:Zcard

############################### 获取长度 ######################################
# Zcard	# 获取Zset长度
				
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> zadd zsalary 500 zhangsan
(integer) 1
127.0.0.1:6379> zadd zsalary 1000 zhaosi
(integer) 1
127.0.0.1:6379> zcard zsalary	# 获取zset长度
(integer) 2

1.5.5 移除-按value

5.移除-按value:Zrem

############################### 移除-按value ######################################
# Zrem	# 按value值从zset移除元素
				
127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> zadd zsalary 500 zhangsan
(integer) 1
127.0.0.1:6379> zadd zsalary 1000 zhaosi
(integer) 1
127.0.0.1:6379> zrange zsalary 0 -1
1) "zhangsan"
2) "zhaosi"
127.0.0.1:6379> zrem zsalary zhaosi	# 按value值从zset移除元素
(integer) 1
127.0.0.1:6379> zrange zsalary 0 -1
1) "zhangsan"

1.6 Hash 散列

1. 所有Hash命令都是用H开头的,Redis命令不区分大小写 2. Hash中也是key-value形式,但value是一个map集合,相当于 key-\

1.Hash基本kv操作:Hset、Hget、Hkeys、Hvals、Hgetall、Hexists
2.Hash复合型kv操作:Hsetnx
3.Hash批量kv操作:Hmset、Hmget、Hdel
4.获取长度:Hlen


1.6.1 Hash基本kv操作

1.Hash基本kv操作:Hset、Hget、Hkeys、Hvals、Hgetall、Hexists

############################### Hash基本key操作 ######################################
# Hset 		# Hash设置值
# Hget		# Hash获取值
# Hkeys		# 获取指定Hash的所有key
# Hvals		# 获取指定Hash的所有value
# Hgetall	# 获取指定Hash的所有key和value
# Hexists	# 判断指定Hash的某一个key是否存在,返回1=存在,0=不存在

127.0.0.1:6379> flushdb # 清空当前数据库
OK
127.0.0.1:6379> Hset myhash field01 hello	# Hash设置值
(integer) 1
127.0.0.1:6379> Hset myhash field02 world	
(integer) 1
127.0.0.1:6379> Hget myhash field01			# Hash获取值
"hello"
127.0.0.1:6379> Hkeys myhash				# Hash获取所有key
1) "field01"
2) "field02"
127.0.0.1:6379> Hvals myhash				# Hash获取所有value
1) "hello"
2) "world"
127.0.0.1:6379> Hgetall myhash				# Hash获取所有key和value
1) "field01"
2) "hello"
3) "field02"
4) "world"
127.0.0.1:6379> Hexists myhash field01		# Hash判断某一个key是否存在
(integer) 1										# 1=存在
127.0.0.1:6379> Hexists myhash field03
(integer) 0										# 0=不存在

1.6.2 Hash复合型kv操作

2.Hash复合型kv操作:Hsetnx

############################# Hash复合型key操作 #############################################
# Hsetnx 	# 不存在再设置key(在分布式锁中,会经常使用),返回1=成功,0=失败。Hsetnx = Hexists + Hset

127.0.0.1:6379> flushdb	# 清空当前数据库
OK
127.0.0.1:6379> Hset myhash f1 v1	# 给myhash的f1设置值
(integer) 1
127.0.0.1:6379> Hsetnx myhash f1 v3	# 给myhash的f1设置值(此时f1已经存在了)
(integer) 0							# 0=失败
127.0.0.1:6379> Hsetnx myhash f2 v2	# 给myhash的f2设置值
(integer) 1							# 1=成功
127.0.0.1:6379> Hgetall myhash		# 获取myhash所有key和value
1) "f1"
2) "v1"
3) "f2"
4) "v2"

1.6.3 Hash批量kv操作

3.Hash批量kv操作:Hmset、Hmget、Hdel

############################### Hash批量key操作 ######################################
# Hmset 	# Hash批量设置值 
# Hmget		# Hash批量获取值
# Hdel		# HAsh批量删除值

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hmset myhash f1 v1 f2 v2	# Hash批量设置值 
OK
127.0.0.1:6379> hmget myhash f1 f2			# Hash批量获取值
1) "v1"
2) "v2"	
127.0.0.1:6379> hdel myhash f1 f2			# Hash批量删除值
(integer) 2
127.0.0.1:6379> hmget myhash f1 f2
1) (nil)
2) (nil)

1.6.4 获取长度

4.获取长度:Hlen

############################### 获取长度 ######################################
# Hlen	# 获取指定hash长度(key的数量)

127.0.0.1:6379>  flushdb	# 清空数据库
OK
127.0.0.1:6379> hmset myhash k1 v1 k2 v2	# 批量设置值
OK
127.0.0.1:6379> Hlen myhash	# 获取hash长度
(integer) 2

1.6.5 自增

5.自增:Hincrby

############################### 自增 ######################################
# Hincrby	# 指定步长增 i+=  可以传<0的参数,相当于decrby

127.0.0.1:6379>  flushdb	# 清空数据库
OK
127.0.0.1:6379> hset myhash f1 1
(integer) 1
127.0.0.1:6379> Hincrby myhash f1 2	# 指定步长增 i+=2
(integer) 3
127.0.0.1:6379> Hincrby myhash f1 -5 # 指定步长增 i+=-5
(integer) -2
127.0.0.1:6379> hgetall myhash
1) "f1"
2) "-2"

二、三种特殊数据类型


2.1 Geospatial 地理空间

geo命令全国主要城市经纬度
1. 所有Geospatial命令都是用G开头的,Redis命令不区分大小写
2. Redis 的 Geo 在 Redis3.2版本推出,这个功能可以推算地理位置的信息, 两地之间的距离,方圆几里的人。
原理:GEO 底层实现原理是Zset,我们可以使用Zset命令来操作Geo
应用:朋友定位,附近的人,打车距离计算

1.添加地理位置:GeoAdd
2.获取地理位置:GeoPos
3.获取直线距离:GeoDist
4.*获取直线距离的哈希值:GeoHash
5.我附近的人:GeoRadius
6.成员附近的成员:GeoRadiusByMember

2.1.1 添加地理位置 GeoAdd

geoadd命令

1.添加地理位置:GeoAdd

############################### 添加地理位置 ######################################
# GeoAdd	# 添加地理位置
			# 参数:key 值(经度、纬度、名称)* ,可以同时添加多个(Redis中文官网提示是错误的 => 纬度、经度、名称 )
			# 规则 两极(南极、北极)无法直接添加,一般会下载城市数据,直接通过java一次性导入
			# 有效经度范围为-180 ~ 180度。有效纬度范围为-85.05112878到85.05112878度。
			# 超出范围则会报出错误,经度、纬度对无效
				# 127.0.0.1:6379> geoadd china:city 39.91667 116.41667 beijing
				# (error) ERR invalid longitude,latitude pair 39.916670,116.416670
			# 没有GEODEL命令,可以使用ZREM来删除元素。Geo索引结构只是一个排序的集合。
	
127.0.0.1:6379> flushdb	# 清空数据库
OK
127.0.0.1:6379> geoadd china:city 116.41667 39.91667 beijing	# 添加地理位置 - 北京
(integer) 1
				# 添加地理位置 - 上海,天津,重庆
127.0.0.1:6379> geoadd china:city 121.43333 34.50000 shanghai 117.20000 39.13333 tianjin 106.45000 29.56667	chongqing 
(integer) 3

2.2.2 获取地理位置 GeoPos

2.获取地理位置:GeoPos

############################### 获取地理位置 ######################################
# GeoPos	# 获取地理位置(经度、纬度)

127.0.0.1:6379> flushdb	# 清空数据库
OK
				# 添加地理位置 - 北京,上海,天津,重庆
127.0.0.1:6379> geoadd china:city 116.41667 39.91667 beijing 121.43333 34.50000 shanghai 117.20000 39.13333 tianjin 106.45000 29.56667 chongqing 
(integer) 3
127.0.0.1:6379> geopos china:city beijing	# 获取地理位置 - 北京
1) 1) "116.41667157411575317"
   2) "39.91667095273589183"
127.0.0.1:6379> geopos china:city beijing chongqing	# 获取地理位置 - 北京、重庆
1) 1) "116.41667157411575317"
   2) "39.91667095273589183"
2) 1) "106.4500012993812561"
   2) "29.56666939001875249"

2.2.3 获取直线距离 GeoDist

3.获取直线距离:GeoDist

############################### 获取直线距离 ######################################
# GeoDist	# 获取两点之间的直线距离
			# 单位 m=米,km=千米,mi=英里,ft=英尺

127.0.0.1:6379> flushdb	# 清空数据库
OK
				# 添加地理位置 - 北京,上海,天津,重庆
127.0.0.1:6379> geoadd china:city 116.41667 39.91667 beijing 121.43333 34.50000 shanghai 117.20000 39.13333 tianjin 106.45000 29.56667 chongqing 
127.0.0.1:6379> geodist china:city beijing shanghai km # 北京-上海的直线距离(千米)
"748.3469"
127.0.0.1:6379> geodist china:city beijing chongqing km # 北京-重庆的直线距离(千米)
"1465.8918"

2.2.4 *获取直线距离哈希值 GeoHash

4.获取直线距离的哈希值:GeoHash

############################### 获取直线距离 ######################################
# GeoDist	# 获取两点之间的直线距离(将二维的经纬度转换为一维的字符串)
			# 如果两个字符串看起来越接近,那么距离越近

127.0.0.1:6379> flushdb	# 清空数据库
OK
				# 添加地理位置 - 北京,上海,天津,重庆
127.0.0.1:6379> geoadd china:city 116.41667 39.91667 beijing 121.43333 34.50000 shanghai 117.20000 39.13333 tianjin 106.45000 29.56667 chongqing 
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4g14s53n0"
2) "wm78nq6w2f0"

2.2.5 我附近的人 GeoRadius

4.我附近的人:GeoRadius

############################### 获取直线距离 ######################################
# GeoRadius	# 获得所有附近的人的地址,定位,通过半径来查询
			# 参数:经度 纬度 距离 单位 其他可选参数
			# 单位 m=米,km=千米,mi=英里,ft=英尺

127.0.0.1:6379> flushdb	# 清空数据库
OK
				# 添加地理位置 - 北京,上海,天津,重庆
127.0.0.1:6379> geoadd china:city 116.41667 39.91667 beijing 121.43333 34.50000 shanghai 117.20000 39.13333 tianjin 106.45000 29.56667 chongqing 
	# 以110,30经纬度为中心 寻找附近1000km的城市
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
	# 以110,30经纬度为中心 寻找附近1200km的城市 - 显示经度、纬度
127.0.0.1:6379> georadius china:city 110 30 1200 km withcoord 
1) 1) "chongqing"
   2) 1) "106.4500012993812561"
      2) "29.56666939001875249"
2) 1) "shanghai"
   2) 1) "121.4333304762840271"
      2) "34.49999971716130887"
	# 以110,30经纬度为中心 寻找附近1300km的城市 - 显示经度、纬度,具体距离
127.0.0.1:6379> georadius china:city 110 30 1300 km withcoord withdist
1) 1) "chongqing"
   2) "346.0548"
   3) 1) "106.4500012993812561"
      2) "29.56666939001875249"
2) 1) "shanghai"
   2) "1185.2509"
   3) 1) "121.4333304762840271"
      2) "34.49999971716130887"
3) 1) "tianjin"
   2) "1210.1434"
   3) 1) "117.19999998807907104"
      2) "39.13333058676914078"
4) 1) "beijing"
   2) "1247.6020"
   3) 1) "116.41667157411575317"
      2) "39.91667095273589183"
	# 以110,30经纬度为中心 寻找附近1300km的城市中最近的3个 - 显示距离
127.0.0.1:6379> georadius china:city 110 30 1300 km withdist asc count 3 
1) 1) "chongqing"
   2) "346.0548"
2) 1) "shanghai"
   2) "1185.2509"
3) 1) "tianjin"
   2) "1210.1434"

2.2.6 成员附近的成员 GeoRadiusByMember

5.成员附近的成员:GeoRadiusByMember

############################### 获取直线距离 ######################################
# GeoRadiusByMember	# 获得某个成员附近其他成员,通过半径来查询
			# 参数:经度 纬度 距离 单位 其他可选参数
			# 单位 m=米,km=千米,mi=英里,ft=英尺

127.0.0.1:6379> flushdb	# 清空数据库
OK
				# 添加地理位置 - 北京,上海,天津,重庆
127.0.0.1:6379> geoadd china:city 116.41667 39.91667 beijing 121.43333 34.50000 shanghai 117.20000 39.13333 tianjin 106.45000 29.56667 chongqing 
	# 以北京为中心 寻找附近500km的城市 - 显示距离
127.0.0.1:6379> georadiusbymember china:city beijing 500 km withdist
1) 1) "tianjin"
   2) "110.0343"
2) 1) "beijing"
   2) "0.0000"
	# 以北京为中心 寻找附近1000km的城市 - 显示距离
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km withdist
1) 1) "shanghai"
   2) "748.3469"
2) 1) "tianjin"
   2) "110.0343"
3) 1) "beijing"
   2) "0.0000"

2.2.7 zset操作geo

5.成员附近的成员:GeoRadiusByMember

############################### 获取直线距离 ######################################
# zrange # 获取指定索引范围内的zset值
# zrem # 删除-按value

127.0.0.1:6379> flushdb	# 清空数据库
OK
				# 添加地理位置 - 北京,上海,天津,重庆
127.0.0.1:6379> geoadd china:city 116.41667 39.91667 beijing 121.43333 34.50000 shanghai 117.20000 39.13333 tianjin 106.45000 29.56667 chongqing 
127.0.0.1:6379> zrange china:city 0 -1	# 获取zset列表
1) "chongqing"
2) "shanghai"
3) "tianjin"
4) "beijing"
127.0.0.1:6379> zrem china:city beijing	# 删除zset指定元素
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1	# 重新获取
1) "chongqing"
2) "shanghai"
3) "tianjin"

2.2 Hyperloglog 基数统计

基数

  在数学上,基数或势,即集合中包含的元素的“个数”(参见势的比较),是日常交流中基数的概念在数学上的精确化(并使之不再受限于有限情形)。有限集合的基数,其意义与日常用语中的“基数”相同,例如{{a,b,c}的基数是3。无限集合的基数,其意义在于比较两个集的大小,例如整数集和有理数集的基数相同;整数集的基数比实数集的小。

Hyperloglog

1. 所有Hyperloglog命令都是用P开头的,Redis命令不区分大小写
简介:Redis 2.8.9 版本起使用 Hyperloglog 数据结构,是用来做基数统计的算法。
优点:占用的内存是固定的,最多存储 2^64 个不同的元素的基数,只需要12kb内存。从内存角度考虑 Hyperloglog 是首选。
缺点0.81%的错误率,以统计为目的的场景下,这种缺点是可以接受的。
应用统计网页UserView,UV(用户访问次数,单个用户访问多次仍算作一个)。
   传统方式使用set保存用户id,再统计set中的元素数量,这种方式如果数据量过大就比较麻烦。

############################### Hyperloglog基本操作案例 ######################################
# pfadd		# hyper集合添加元素
# pfcount	# hyper集合计数
# pfmerge	# hyper创建一个新集合(基于两个已有集合的并集)

127.0.0.1:6379> flushdb	# 清空数据库
OK				
127.0.0.1:6379> pfcount myhyper	# hyper对象添加元素
(integer) 5
127.0.0.1:6379> pfadd myhyper2 c d e f g h	# 查看基数
(integer) 1
127.0.0.1:6379> pfcount myhyper2
(integer) 6
127.0.0.1:6379>  pfmerge myhyper3 myhyper myhyper2	# 合并 myhyper3 = myhyper + myhyper2
OK
127.0.0.1:6379> pfcount myhyper3	# 查看并集的基数
(integer) 8							# a b c d e f g h 一共8个

2.3 Bitmaps 位图

1. 所有Bitmaps命令都是用B开头的,Redis命令不区分大小写
简介位存储表示只需要一个字节(bit),Bitmaps位图都是操作二进制来进行记录的,其值只有0或1。
优点
缺点0.81%的错误率,以统计为目的的场景下,这种缺点是可以接受的。
应用:统计疫情感染人数(感染、未感染)、统计用户信息(活跃、不活跃)、打卡记录(打卡、未打卡)等只有两种状态的场景

############################### Bitmaps实现打卡记录案例 ######################################
# setbit		# Bitmaps位图添加元素
# getbit		# Bitmaps位图获取元素
# getbit		# Bitmaps位图获取元素

127.0.0.1:6379> flushdb	# 清空数据库
OK		
127.0.0.1:6379> setbit sign 0 1	# 第一个参数表示星期几,第二个参数表示打卡状态(0=打卡,1=未打卡)
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 0	# 查看某一天是否打卡
(integer) 1
127.0.0.1:6379> getbit sign 1
(integer) 0
127.0.0.1:6379> bitcount sign	# 统计打卡数量
(integer) 3

三、常用命令行

shutdown 关服务器
qiut / exit 退出服务器
auth + password 验证登录
config get requirepass 获取密码
config set requirepass abc 设置密码
info replication 查看主从信息
slaveof host port 让自己成为从机(认别的服务器当主机)
slaveof no one 从机让自己变成主机(主机挂掉后)。


3.1 登录验证 auth

临时密码

这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效

1) 首先进入redis,如果没有开启redis则需要先开启【这里是macos的终端Terminal】

groupiesm@GroupiesMdeMacBook-Pro src % redis-cli -p 6379
127.0.0.1:6379> ping
PONG

2)查看当前redis有没有设置密码:

127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""

3) 为以上显示说明没有密码,那么现在来设置密码:

127.0.0.1:6379> config set requirepass abc
OK
127.0.0.1:6379> quit
groupiesm@GroupiesMdeMacBook-Pro src %

4) 再次查看当前redis就提示需要密码:

groupiesm@GroupiesMdeMacBook-Pro src % redis-cli -p 6379
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth abc
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> config set requirepass ""
OK

永久密码

1) 修改redis.conf配置文件,需要永久配置密码的话就去redis.conf的配置文件中找到requirepass这个参数,如下配置:

# requirepass foobared
requirepass 123   # 指定密码123

2) 保存后重启redis就可以了

3) redis-cli连接redis

groupiesm@GroupiesMdeMacBook-Pro src % redis-cli -p 6379
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123        # 指定密码
OK
127.0.0.1:6379> keys *
1) "k1"

3.2 主从复制

  1) 通过 info replication 命令查看主从信息。
  2) 命令行配置主从:将 host 认作自己的主机、是自己成为从机: slaveof host port。主机宕机时,从机使用slaveof no one让自己变成主机,其他的节点就可以手动连接到最新的主节点。
  3) 配置文件主从:通过修改redis.conf文件的 REPLICATION => replicaof 参数,指定主机。

【客户端】 info replication

groupiesm@GroupiesMdeMacBook-Pro src % redis-cli	# 连接客户端
127.0.0.1:6379> info replication
# Replication
role:master											# 默认就是主库
connected_slaves:0									# 没有从机
master_failover_state:no-failover
master_replid:b554ade72abcc57bbe4ad788ea2fa271f6b86f77		# 随机生成id
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

【从机6382】 将 6379 认作自己的主机 slaveof localhost 6379

groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % pwd
/Users/d/develop/redis-6.2.6
groupiesm@GroupiesMdeMacBook-Pro redis-6.2.6 % redis-cli -p 6381
127.0.0.1:6381> ping
PONG
127.0.0.1:6381> info replication
# Replication
role:master			# master = 主节点
connected_slaves:0
master_failover_state:no-failover
master_replid:fcd1f40d668af3650bd12c5237fad0a423596e0f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> slaveof localhost 6379		# 认主机
OK
127.0.0.1:6381> info replication
# Replication
role:slave									# 角色:从机
master_host:localhost						# 主机ip
master_port:6379							# 主机端口
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:98
slave_repl_offset:98
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:863ab25b84788aad9f6daa930b5403efbd282ca9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:99
repl_backlog_histlen:0

22/03/07

M

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值