Redis常用命令
基于内存的数据库
字符串
Redis默认使用字符串存储数据的,并且用二进制存储,较为安全
| SET key value | 增加值(key区分大小写) |
| GET key | 获取值 |
| INCR key | 对应value加一(value是数字) |
| DECR key | 对应value减一(value是数字) |
| INCRBY key value1 | 对应value加value1(value是数字) |
| DECRBY key value1 | 对应value减value1(value是数字) |
| DEL key | 删除键 |
| EXISTS name | 判断是否存在 |
| KEYS * | 查看所有的键 |
| KEYS *me | 查看以me结尾的键 |
| FLUSHALL | 删除所有的键 |
| clear | 清空命令行 |
要支持中文的话,需要在登录redis客户端时加入 --raw参数
redis-cli --raw| TTL key | 查看键的过期时间(输出-1表示未设置,-2过期了) |
| EXPIRE key 10 | 设置还有10秒过期 |
| SETEX key 5 value | 设置一个键,过期时间5秒 |
| SETNX key value | 当不存在这个键,才设置这个值 |
列表
列表的起始位置的序号是0,元素间有顺序
| LPUSH list_name value | 在list_name头部放入value |
| LRANGE list_name 0 -1 | 查看列表中所有内容 |
| LPUSH list_name value1 value2 ... | 按顺序一次放入多个值 (后添加的数据在前面) |
| LPOP list_name | 删除头部第一个元素 返回删除元素 |
| LPOP list_name 2 | 删除头部前两个元素 |
| RPOP list_name | 删除尾部第一个元素 返回删除元素 |
| LLEN list_name | 返回列表元素个数 |
| LTRIM list_name 1 3 | 保留索引1到3之间的元素 |
集合SET
元素间没用顺序,且不重复
| SADD set_name value1 value2 | 向集合中加入元素,返回1表示添加成功 返回0表示添加失败(重复添加相同元素) |
| SMEMBERS set_name | 查看集合中的所有元素 |
| SISMEMBER set_name value | 判断元素是否在集合中,返回1是在,0不在 |
| SREM set_name value | 删除元素,返回1表示成功,0失败 |
| SINTER set1 set2 ...... | 返回集合的交集 |
| SUNION set1 set2 ...... | 返回集合的并集 |
| SDIFF set1 set2 ...... | 返回第一个集合与别的集合差集 |
有序集合SortedSet
根据自定义的分数对集合内的元素进行升序的排序
| ZADD set score1 key1 score2 key2 ...... | 向集合中添加元素, 返回添加的个数 |
| ZRANGE set 0 -1 | 查看所有元素 |
| ZRANGE set 0 -1 WITHSCORES | 输出元素的同时输出分数 |
| ZSCORE set key | 查看分数 |
| ZRANK set key | 查看排名(0开始数) |
| ZREVRANK set key | 反转顺序后的排名 |
| ZREM set key | 删除 |
| ZINCRBY set score key | 增加某个成员分数 |
| ZREMRANGEBYRANK set start stop | 按照顺序删除范围内的元素 |
哈希Hash
键映射到值,适合用来存储对象
| HSET Hash_name key value | 添加元素 |
| HGET Hash_name key | 获取值 |
| HGETALL Hash_name | 获取所有的键值对 |
| HDEL Hash_name key | 删除键值对 |
| HEXISTS Hash_name key | 是否存在键,返回1表示存在,0表示不存在 |
HKEYS Hash_name | 获取所有的键 |
| HLEN Hash_name | 获取长度 |
发布订阅模式
| SUBSCRIBE channel | 订阅频道 |
| PUBLISH channel content | 在频道上发布消息 |
但消息无法持久化,无法记录历史消息
消息队列Stream
| XADD stream_name * key1 value1 key2 value2 | 向队列内添加多个键值对,*表示自动生成消息ID,如果自己指定ID,格式满足 数字-数字,第一个数字是时间戳,第二个数字是序列 |
| XLEN stream_name | 消息队列长度 |
| XRANGE stream_name - + | 显示所有的消息 |
| XDEL stream_name id | 删除消息,返回1表示成功,0表示失败 |
| XTRIM stream_name MAXLEN 0 | 删除所有消息,返回删除个数 |
| XREAD COUNT 2 BLOCK 1000 STREAMS stream_name 0 | 读取两条消息,如果没有则阻塞1000毫秒,并且从第0个开始读取 |
| XREAD COUNT 2 BLOCK 1000 STREAMS stream_name $ | 读取两条消息,如果没有则阻塞1000毫秒,只读取当前时刻之后的消息 |
| XGROUP CREATE stream_name group_name id | 创建了一个消费者组,id为其id |
| XINFO GROUPS stream_name | 查看消费者组的信息 |
| XGROUP CREATECONSUMER stream_name group_name consumer_name | 向消费者组内添加消费者 |
| XREADGROUP GROUP group_name consumer_name COUNT 2 BLOCK 3000 stream_name > | 消费者组内读取2条消息,没有则阻塞3000毫秒,>只读取从未被当前消费者组中任何消费者读取过的新消息 |
地理空间Geospatial
| GEOADD name longitude1 latitude1 city_name1 longitude2 latitude2 city_name2 ..... | 添加位置的经纬,返回1表示添加成功 |
| GEOPOS name city_name | 获取经纬度 |
| GEODIST city city_name1 city_name2 | 计算位置间距离(米) |
| GEODIST city city_name1 city_name2 KM | 计算位置间距离(千米) |
| GEOSEARCH city FROMMEMBER city_name BYREDIUS 300KM | 返回city_name为中心300km内的城市 |
位图Bitmap
本质是string的扩展,只有0或1,类似与bool数组
| SETBIT name 0 1 | 在0的位置上设为1 |
| SETBIT name 1 0 | 在1的位置上设为0 |
| GETBIT name 0 | 获取位置0的值 |
| SET name "\xF0" | 设置为11110000 |
| BITCOUNT name | 统计有多少个1 |
| BITPOS name 0 | 第一个出现0的位置 |
| BITPOS name 0 start end | 范围内第一个出现0的位置 |
位域
将很多小的整数存储在一个较大的位图中,高效使用内存
| BITFIELD var set u8 #0 1 | 设置了一个变量为8位无符号(u8),并且第一个位置(#0)设为1 |
| BITFIELD var get u8 #0 | 获取第0个值 |
| BITFIELD var set u8 0 25 | 从第0位开始使用8位设为u8,值为25 |
BITFIELD var set u32 #1 100 等价于 BITFIELD var set u32 32 100 | 从第32位起到63共32位设置为32位非负整数100 |
BITFIELD var get u32 #1 等价于 BITFIELD var get u32 32 | 读取从第32位起到63共32位设置为32位非负整数的值 |
事务
可以不用保证所有的事务都必须执行完,执行失败的命令不会影响别的命令
| MULTI | 开启事务,开启后可以输入命令了,但不会立马执行 |
| EXEC | 执行之前输入的命令,然后退出事务 |
持久化
主要有两种方式,分别是RDB和AOF
RDB是指在固定时间内将内存中的数据快照写入磁盘,是某个时间点上数据的完整副本,通过配置文件中的save参数配置
| save 3600 1 | 3600秒内,只有有一次修改,就进行一次快照 |
| save | 在客户端执行,直接进行快照 |
在执行快照的过程中redis不会执行别的命令,可以通过bgsave创建一个进程执行快照,主进程不受影响。
AOF(Append-Only File)追加文件,原理是在执行写入命令的时候不仅写入内存中,还会将命令写入一个追加的文件,这个就是AOF文件,当redis重启的时候会重新执行里面的命令,来在内存中重建整个数据,只需要在配置文件中设置如下
appendonly yes主从复制
指将一个Redis服务器的数据自动同步到另一台,也叫主节点和从节点,一个主节点可以有多个从节点,一个从节点只有一个主节点,数据复制是单向的,只能主到从,一般主节点负责写,从节点负责读。
设置方式首先添加一个从节点配置文件redis-6380.conf(6380代表从节点的redis使用的端口号)
修改端口号
port 6380指定主节点
replicaof 127.0.0.1 6379 #主节点的ip和redis的端口在同一台电脑上运行从节点需要修改pidfile,dbfilename,否则不需要修改,一般加一个端口号在末尾。 我是在同一台电脑上执行,所以需要修改。
pidfile /var/run/redis_6380.pid dbfilename dump-6380.rdb #当执行save或bgsave命令时,就会把内存中的数据保存在这个文件中运行从节点的redis
redis-server redis-6380.conf启动从节点客户端
redis-cli -p 6380查看从属信息,可以看到属于slave,和主节点信息
info replication #输出如下 127.0.0.1:6380> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:0 master_link_down_since_seconds:1779251915 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:6a4f3f436717ab34ef7822ef0cc4b8583c7931e6 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哨兵模式
如果在刚刚的主从节点集群中主节点出现宕机,就需要把一个从节点升级为主节点,需要人工干预,为了解决这个问题提出了哨兵模式。
哨兵会以一个独立的进程运行在redis集群中,用来监控Redis集群中的各个节点是否运行正常,主要执行下面几个功能。
1,监控
通过不断的发送命令来检查redis节点是否正常
2,通知
如果某个节点出现异常,哨兵就会通过发布订阅模式来通知其他节点
3,自动故障转义
当主节点不能正常工作的时候,哨兵开始自动故障转义,将一个从节点升级为新的主节点,然后再将其他从节点指向新的主节点。
配置哨兵模式:
添加哨兵节点配置文件sentinel.conf,输入以下内容,mater表示主节点名称,后跟IP和端口号,1表示只需要1个哨兵节点同意就可以进行故障转移
sentinel monitor master 127.0.0.1 6379 1启动哨兵模型
redis-sentinel sentinel.conf哨兵本身是一个线程,也会可能出现关闭,所以在实际生成中会使用多个哨兵,并从中推选出一个领导者来监控其他哨兵,如果领导者关闭,会重新推选出新的领导者
