redis(5.0.3) 常用命令整理 (建议收藏)

redis(5.0.3) 常用命令整理

数据结构互通

  • 字符串可以直接输入,也可以用’'或者""括起来

基本操作

> CLEAR						# 清屏
> KEYS *					# 获取当前数据库所有的key
> EXISTS key				# 查看key是否存在,存在返回1、失败返回0
> config set requirepass 123456		# 设置密码为123456
> auth 123456				# 使用123456登录,登录成功后可以正常执行命令

五大数据类型

String

> SET key value				# 设置key-value,若存在则覆盖
> GET key					# 获取key对应的value

> APPEND key value 			# 追加value,返回追加后的长度,key不存在则相当于SET
> STRLEN key 				# 查看key长度

> GETRANGE key 0 -1 		# 截取[0,-1]的字符串(闭区间)
> SETRANGE key 2 abc		# 从下标2开始的字符串依次替换为abc

> INCR key					# 自增1
> DECR key					# 自减1
> INCRBY key 10				# 自增10
> DECRBY key 10				# 自减10

> setex key 10 value		# 设置value 10s后过期
> setnx key value			# 设置成功返回1、失败返回0	

> MSET k1 v1 k2 v2			# 批量SET
> MGET k1 k2 k3 k4			# 批量GET
> MSETNX k1 v1 k2 v2		# 批量SETNX,有一个key存在即失败,其他k-v设置均无效


> SET user:1:name jack		# 对象设计模式例子
> SET user:1:age 21

> GETSET key kv value		# 先get再set,返回先get的值

List

# 类似栈数据结构,操作为进栈出栈
> LPUSH list v1 v2 v3		# 依次从列表list左边插入一个或多个值
> LPOP  list				# 依次从列表list左边移除第一个值,返回这个值
> RPUSH list v1 v2 v3		# 依次从列表list右边插入一个或多个值
> RPOP  list				# 依次从列表list右边移除第一个值,返回这个值

> LLEN list					# 返回列表list长度
> LINDEX list 2				# 通过下标索引列表list中的某个值
> LRANGE list 0 -1			# 查看列表list的[0,-1]的value
> LREM list 2 v1			# 删除列表list中的两个值v1(列表元素可以重复)
> LTRIM list 2 4			# 截取列表list下标[2,4]部分,并保存在list中
> RPOPLPUSH list list2		# 移除列表list中最右边的元素,并将其添加到列表list2最左边

> LSET list 0 v2			# 将列表list下标为0的元素内容更新为v2,下标元素需存在
> LINSERT list BEFORE v1 v2	# 在列表list中的最左边的v1前面插入v2
> LINSERT list AFTER v1 v2	# 在列表list中的最左边的v1后面插入v2

Set

# 添加、查看、删除
> SADD myset value			# 给集合myset添加新元素value,集合不存在则创建
> SMEMBERS myset			# 查看集合myset中的元素
> SRANDMEMBER myset			# 随机返回集合中的一个元素

> SISMEMBERS myset v1		# 判断集合myset中是否存在元素v1,存在返回1,否则返回0
> SCARD myset				# 查看集合myset长度

> SREM myset v2				# 移除集合myset中的v2元素,成功返回1,失败返回0
> SMOVE myset1 myset2 value	# 把集合myset1中的value元素移动到集合myset2中

> SDIFF A1 A2				# 对于集合A1、A2,返回A1-(A1∩A2)
> SINTER mset1 mset2		# 返回集合mset1和集合mset2的交集
> SUNION mset1 mset2		# 返回集合mset1和集合mset2的并集

Hash

Map 集合,key-map,和 String 类型一样,只是套了一层娃。

> HSET myhash key1 value1	# 创建一个map集合myhash,后面跟key-value 存在myhash中
> HGET myhash key1			# 获取myhash中的key1对应的值
> HKEYS myhash				# 获取myhash中所有的key
> HDEL myhash k1 k2 		# 删除myhash中的k1 k2

> HLEN myhash 				# 返回myhash中key的数量
> HEXISTS myhash key1		# 判断myhash中key1是否存在,存在返回1,失败返回0

> HMSET myhash k1 v1 k2 v2	# 一次性在myhash中创建多组key-value (HSET也可以)
> HMGET	myhash k1 k2 k3		# 一次获取myhash中多个key对应的value
> HGETALL myhash			# 获取myhash中的全部key-value
......
# String中有的方法 Hash 中都可以用,在String的命令前面加个H即可。

Zset

在集合Set类型上添加一个值score作为索引,使其可以有序。

> ZADD myzset 1 v1 2 v2 			# 在集合myzset中添加两个元素1、2为score
> ZREM myzset v1 v2					# 删除有序集合myzset中的v1、v2元素
> ZRANGE myzset 0 -1				# 按下标查看myzset中的元素
> ZCARD myzset						# 获取有序集合myzset元素个数
> ZCOUNT myzset 1 3					# 返回索引在[1,3]中的元素的数量

> ZRANGEBYSCORE mzs -inf +inf		# 按score正序排序
> ZREVRANGEBYSCORE mzs +inf -inf	# 按score逆序排序
......
# 同样集合Set的命令在有序集合Zset中也适用,需将命令开头的S换为Z

三种特殊数据类型

geospatial 地理位置

底层为Zset类型,可使用Zset类型对应命令

# 给key添加一个成员value1以及它的经纬度
> GEOADD key [Longitude](经度) [Latitude](纬度) value1 ...

# 返回key中value1、value2成员的经纬度
> GEOPOS key value1 value2 ...

# 返回成员value1与value2之间的距离,后面跟单位参数
> GEODIST key value1 value2 km(m/km/ft/mi)

# 将key中value1成员的[二维]经纬度信息转化为11个字符的[一维]Geohash字符串
> GEOHASH key value1 ...

# 返回经纬度(117,39)为中心,返回半径1000km内的成员
> GEORADIUS 117 39 1000 km(m/km...) 

# 返回key中value1成员方圆1000km以内的所有成员(包括自己)
> GEORADIUSBYMEMBER key value1 1000 km
  • GEOHASH 的算法(一维数据 方便比较)

    1、将经纬度转化为二进制

    2、经度占偶数位,纬度占奇数位,经纬度合并

    3、使用Base32进行编码

Hyperloglog

用来统计基数数量,有微小误差

基数:一个集合中不重复元素的数量

> PFADD key1 a b c d e c 		# 创建一组元素key1
> PFCOUNT key1					# 返回key1元素中基数数量
> PFMERGE key3 key1 key2		# 将合并集合key1、key2到key3中

Bitmap

位图,位存储、二进制存储,多用于两个状态的数据,通过操作二进制来记录数据。

打卡、未打卡,可以记录为:0 1 0 0 1 1 1 0 1 1 0 1

# 模拟记录打卡,周一至周五,周三周四未打卡如下所示
> SETBIT sign 0 1			
> SETBIT sign 1 1
> SETBIT sign 2 0
> SETBIT sign 3 0
> SETBIT sign 4 1

> GETBIT sign 0					# 查看周一的值

> BITCOUNT sign					# 统计sign中有多少个1

事务(Transactions)

ACID特性:事务具有4个特征,分别是

  • 原子性(atomicity)
  • 一致性(consistency)
  • 隔离性(isolation)
  • 持久性(durability)

Redis单个命令有原子性,但redis的事务不保证原子性

Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行(类似队列),所有的事务只有在发起执行命令的时候才会执行。

一次性、顺序性、排他性

Redis事务

> MULTI					# 开启事务

# 命令入队
> set k1 v1
> set k2 v2
> get k2
> set k2 v22
> get k2

> EXEC					# 执行事务,命令执行后一次性执行完入队的命令
> DISCARD				# 放弃事务,所有入队的命令全部无效

两种异常情况

  • 语法错误异常

    对于语法错误的异常,redis事务处理将会保留原子性,有一个命令出错,所有命令全部无效

  • 逻辑错误异常

    对于逻辑错误的异常,如对一个空值加一,redis事务不保留原子性,错误的命令抛出异常,无误命令的正常执行

监控锁机制

乐观锁

感觉一直没问题,做啥都不加锁,更新数据的时候会去判断数据是否被修改

> WATCH key1 			# 监视key1(监控key1的值),如果事务执行期间,数据没有改动,则事务正常执行,否则事务执行失败

> UNWATCH				# 解除监视,如果事务无论是否正常结束都会自动解锁,unwatch为手动解锁

悲观锁

感觉随时会有问题,干啥都会加锁如setnx

发布订阅

> SUBSCRIBE Gssl				# 订阅Gssl频道,执行后开始监听
> PUBLISH Gssl "Hello World"	# 想Gssl频道发送消息"Hello World"
> PUBSUB CHANNELS 				# 查看活跃的订阅列表
> PUBSUB NUMPAT Gssl			# 查看频道Gssl的订阅个数
> UNSUBSCRIBE Gssl				# 退订Gssl频道
> PUNSUBSCRIBE Gs*sl			# 退订指定模式的频道(可以用通配符)
> PSUBSCRIBE Gs*sl				# 指定模式订阅,订阅Gs开头sl结尾的频道,通过通配符实现?、*、[(一些字符)]

主从复制

192.168.31.111:6379> info replication	# 查看信息
# Replication
role:master				# 主机
connected_slaves:0
master_replid:ad307af8d700c4372d730b57d577ef43934120c6
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

从机需要修改配置文件:port、pidfile、logfile、dbfilename

192.168.31.111:6381> SLAVEOF 192.168.31.111 6379	# 设置主机
OK
192.168.31.111:6381> info replication
# Replication
role:slave			# 从机
master_host:192.168.31.111
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:53f77b52129d0dce6f262283a3ca415c031fdef0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0

通过命令设置是临时的,修改配置文件是永久的
redis(5.0.3) 常用命令整理 (建议收藏)_第1张图片

你可能感兴趣的:(Redis,redis,linux)