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
通过命令设置是临时的,修改配置文件是永久的