1. 基本命令
命令不区分大小写,而key是区分大小写的
# select 数据库间的切换 数据库共计16个
127.0.0.1:6379> select 1
# dbsize 返回当前数据库的 key 的数量
127.0.0.1:6379[1]> dbsize
# keys * 查看数据库所有的key
127.0.0.1:6379[1]> keys *
# flushdb 清除当前数据库
127.0.0.1:6379[1]> flushdb
# flushall 清除全部数据库的内容
127.0.0.1:6379[1]> flushall
# exists key 判断某个 key 是否存在
127.0.0.1:6379[1]> exists name
# type key 查看你的 key 是什么类型
127.0.0.1:6379[1]> type name
# del key 删除指定的 key 数据 阻塞删除 数据比较大的时候会产生等待 不要删除大的key,等待时间长,阻止了其他资源的操作
127.0.0.1:6379[1]> del name
# unlink key 根据 value 选择非阻塞删除 异步删除一个或多个键
# UNLINK 命令的主要特点是它是非阻塞的,unlink命令仅仅是删除键值对,并不会立即将数据从磁盘上删除 它会在后台异步地删除键值对,而不会阻塞服务器的正常操作
# UNLINK 命令非常适合于删除大量键值对或者删除耗时较长的键值对
# UNLINK 命令不接受模式匹配参数,只能指定具体的键名
127.0.0.1:6379[1]> unlink name
# expire key 过期时间 为给定的 key 设置过期时间
127.0.0.1:6379[1]> expire name 10
# ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期
127.0.0.1:6379[1]> ttl name
# move name 数据库编号 移除当前的key到其他数据库
127.0.0.1:6379[1]> move name 1
# clear 清屏
127.0.0.1:6379[1]> clear
# auth 密码 客户端登陆进行密码认证
127.0.0.1:6379[1]> auth 123456
# quit 服务器关闭连接
127.0.0.1:6379[1]> quit
# shutdown 正常关闭,数据保存 redis服务关闭
127.0.0.1:6379[1]> shutdown
# config set key value 修改配置文件 例如设置密码
127.0.0.1:6379[1]> config set requirepass 123456
# config get key 获取配置文件key的值
127.0.0.1:6379[1]> config get requirepass
#help @类型
help @string
help @list
help @hash
help @hyperloglog
2.String字符串类型
String 是 Redis 最基本的类型,一个 key对应一个 value
String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象
String 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 value 最多可以是 512M
数据结构
String 的数据结构为简单动态字符串(Simple Dynamic String,缩写 SDS)。是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配
如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M。
# set <key> <value> 添加键值对
# EX second 设置键的过期时间为 second 秒 SET key value EX second 效果等同于 SETEX key second value
# PX millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value
# NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value
# XX :只在键已经存在时,才对键进行设置操作
# get: 返回旧的值 同时设置新的值
# exat: 以秒为单位的unix时间戳作为过期时间
# pxat: 以豪秒为单位的unix时间戳作为过期时间
# keepttl :保留设置前指定健的生存时间 修改值的同时保留生存时间,不覆盖
127.0.0.1:6379> set name ljy ex 10
127.0.0.1:6379> set name ljy px 100
127.0.0.1:6379> set name ljy nx
127.0.0.1:6379> set name ljy xx
# get <key> 查询对应键值
127.0.0.1:6379> get name
# append <key> <value> 将给定的<value> 追加到原值的末尾
127.0.0.1:6379> append name 18
# strlen <key> 获得值的长度
127.0.0.1:6379> strlen name
# setnx <key> <value> 只有在 key 不存在时 设置 key 的值
127.0.0.1:6379> setnx name lhx
# incr <key> 只能对数字值操作 将 key 中储存的数字值增 1 如果为空,新增值为 1
127.0.0.1:6379> incr age 1
# decr <key> 只能对数字值操作 将 key 中储存的数字值减 1 如果为空,新增值为-1
127.0.0.1:6379> dccr age 1
# incrby <key> <步长> 将 key 中储存的数字值增。自定义步长
127.0.0.1:6379> incrby age 10
# decrby <key> <步长> 将 key 中储存的数字值减。自定义步长
127.0.0.1:6379> decrby age 10
# mset <key1> <value1> <key2> <value2> ... 同时设置一个或多个 key-value 对
127.0.0.1:6379> mset uname ljy age 20
# mget <key1> <key2> <key3> ..... 同时获取一个或多个 value
127.0.0.1:6379> mget uname age
# msetnx <key1> <value1> <key2> <value2> ... 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
# 原子性,有一个失败则都失败
127.0.0.1:6379> msetnx title boy age 20 num 100
# getrange <key> <起始位置> <结束位置> 获得值的范围
127.0.0.1:6379> getrange name 0 2
# setrange <key> <起始位置> <value> 用 <value> 覆写<key>所储存的字符串值,从<起始位置>开始(索引从 0 开始)
# 替换指定位置开始的字符串!参数有几个替换几个
127.0.0.1:6379> setrange name 2 boy
# setex <key> <过期时间> <value> 设置键值的同时,设置过期时间,单位秒
# psetex key milliseconds value 设置key 并设置过期时间 单位豪秒
127.0.0.1:6379> setex key1 10 ljy
127.0.0.1:6379> psetex key1 1000 ljy
# getset <key> <value> 先get到值然后再set他的值 以新换旧,设置了新值同时获得旧值 设置新值并返回之前的旧值
127.0.0.1:6379> getset key1 name
3. List列表
主要特点:单键多值
一个双端链表的结构,容量是2的32次方减1个元素大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
列表底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
# lpush <key><value1><value2><value3> .... 从左边插入一个或多个值
127.0.0.1:6379> lpush name lili leilei hanhan
# rpush <key><value1><value2><value3> .... 从右边插入一个或多个值
127.0.0.1:6379> rpush name ljy lhx
# lpop <key> 从左边吐出一个值 值在键在,值光键亡
127.0.0.1:6379> lpop name
# rpop <key> 从右边吐出一个值 值在键在,值光键亡
127.0.0.1:6379> rpop name
# lrange <key> <start> <stop> 按照索引下标获得元素(从左到右) 0 左边第一个,-1 右边第一个,(0-1 表示获取所有)
127.0.0.1:6379> lrange name 0 -1
# rpoplpush <key1> <key2> 从<key1>列表右边吐出一个值,插到<key2>列表左边
127.0.0.1:6379> rpoplpush name name2
# lindex <key> <index> 按照索引下标获得元素(从左到右)
127.0.0.1:6379> lindex name 2
# llen <key> 获得列表长度
127.0.0.1:6379> llen name
# lrem <key> <n> <value> 从左边删除 n 个 等于value(从左到右)
127.0.0.1:6379> lrem name 1 lili
# ltrim <key> <start> <stop> 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
# 下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推
127.0.0.1:6379> ltrim name 1 -1
# linsert <key> before <value> <newvalue> 在<value>的前面插入<newvalue>插入值
# linsert <key> after <value> <newvalue> 在<value>的后面插入<newvalue>插入值
127.0.0.1:6379> linsert name before lili other
127.0.0.1:6379> linsert name after lili new
# lset <key> <index> <value> 将列表 key 下标为 index 的值替换成 value
127.0.0.1:6379> lset name 1 ppp
4.Set集合
Redis set 对外提供的功能与 list 类似 是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。
单值多value且无重复
# sadd <key> <value1> <value2> 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
127.0.0.1:6379> sadd name ljy lhx lzf
# smembers <key> 取出该集合的所有值
127.0.0.1:6379> smembers name
# sismember <key> <value> 判断集合<key>是否为含有该<value>值,有 1,没有 0
127.0.0.1:6379> sismember name ljy
# scard <key> 返回该集合的元素个数
127.0.0.1:6379> scard name
# srem <key> <value1> <value2> .... 删除集合中的某个元素
127.0.0.1:6379> srem name ljy
# spop <key> [数字] 随机从该集合中吐出N个值 该值从集合中删除
127.0.0.1:6379> spop name 2
# srandmember <key> <n> 随机从该集合中取出 n 个值。不会从集合中删除
127.0.0.1:6379> srandmember name 1
# smove <source> <destination> value 把集合中一个值从一个集合移动到另一个集合
127.0.0.1:6379> smove name name2 ljy
# sinter <key1> <key2> 返回两个集合的交集元素 两个集合中都共有的元素
127.0.0.1:6379> sinter name name2 ljy
# sunion <key1> <key2> 返回两个集合的并集元素
127.0.0.1:6379> sunion name name2
# sdiff <key1> <key2> 返回两个集合的差集元素(key1中有,key2中没有) 以第一个key为主 属于key1但是不属于key2的元素构成的集合
127.0.0.1:6379> sdiff name name2
# sintercard numkeys key ...[limit] 返回结果的基数 由所有给定集合的交集产生的集合的基数
127.0.0.1:6379> sintercard 2 k1 k2
5. Hash
Redis hash 是一个键值对集合,值也是field 和 value
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
# hset <key> <field> <value> 给<key>集合中的 <field> 键赋值 <value>
127.0.0.1:6379> hset info name ljy
# hget <key1> <field> 从<key1>集合<field>取出 value
127.0.0.1:6379> hget info name
# hmset <key1> <field1> <value1> <field2> <value2>... 批量设置 hash 的值
127.0.0.1:6379> hmset info age 10 level 10
# hmget <key1> <field1> <field1> <field1> ... 批量获取 hash 的值
127.0.0.1:6379> hmget info name age level
# hgetall <key1> 获取全部的数据,
127.0.0.1:6379> hgetall info
# hdel <key1> field1 删除hash指定key字段!对应的value值也就消失了!
127.0.0.1:6379> hdel info level
# hlen <key1> 返回哈希表 key 中字段的数量
127.0.0.1:6379> hlen info
# hexists <key1> <field> 查看哈希表 key 中,给定域 field 是否存在。
127.0.0.1:6379> hexists info name
# hkeys <key> 列出该 hash 集合的所有 field
127.0.0.1:6379> hkeys info
# hvals <key>列出该 hash 集合的所有 value
127.0.0.1:6379> hvals info
# hincrby <key> <field> <increment> 为哈希表 key 中的域 field 的值加上增量 1 -1
# hincrbyfloat <key> <field> <increment> 为哈希表 key 中的域 field 的值加上增量小数
127.0.0.1:6379> hincrby info age 1
# hsetnx <key> <field> <value> 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域field 不存在 存在报错
127.0.0.1:6379> hsetnx info name 555
6. 有序集合 Zset
Redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表
# zadd <key> <score1> <value1> <score2> <value2>… 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
127.0.0.1:6379> zadd info 200 name 300 age
# zrange <key> <start> <stop> [WITHSCORES] 返回有序集 key 中,下标在 <start> <stop> 之间的元素 带 WITHSCORES,可以让分数一起和值返回到结果集
127.0.0.1:6379> zrange info 0 -1
# zrevrange salary 0 -1 # 从大到进行排序!
127.0.0.1:6379> zrevrange info 0 -1
# zrangebyscore key min max [withscores] [limit offset count] 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列
127.0.0.1:6379> zrangebyscore info 100 200
127.0.0.1:6379> zrangebyscore info (100 200 #大于100 不包含100
# 显示全部 从小到大
127.0.0.1:6379> zrangebyscore info -inf +inf
# zrevrangebyscore key max min [withscores] [limit offset count] 同上,改为从大到小排列
127.0.0.1:6379> zrevrangebyscore info 900 100
# zcard <key> # 获取有序集合中的个数
127.0.0.1:6379> zcard info
# zincrby <key> <increment> <value> 为元素的 score 加上增量
127.0.0.1:6379> zincrby info 200 age
# zrem <key> <value> 删除该集合下,指定值的元素
127.0.0.1:6379> zrem info age
# zcount <key> <min> <max> 统计该集合,分数区间内的元素个数 大于等于100且小于200
127.0.0.1:6379> zcount info 100 200
# zrank <key> <value> 返回该值在集合中的排名,从 0 开始 顺序
# zrevrank <key> <value> 返回该值在集合中的排名 倒序
127.0.0.1:6379> zrank info name
127.0.0.1:6379> zrevrank info name
# zscore <key> <value> 返回对应元素的score
127.0.0.1:6379> zscore info name
# ZMPOP numkeys key [key ...] <MIN | MAX> [COUNT count]从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对
#当使用MIN修饰符时,弹出的元素是第一个非空排序集中得分最低的元素。MAX修改器会弹出得分最高的元素,numkeys 表示 key 的数量。
127.0.0.1:6379> zmpop 1 set1 min
7.Bitmap
位存储 由0和1状态表现的二进制位的bit数组
位图的本质是数组 底层数据结构是String
Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32=4294967296)
使用场景:用户签到、打卡等
# setbit <key> <offset> <value> 设置 Bitmaps 中某个偏移量的值(0 或 1) offset:偏移量从 0 开始
127.0.0.1:6379> setbit sign 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
# getbit <key> <offset> 获取 Bitmaps 中某个偏移量的值 从 0 开始算
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0
# strlen 不是字符串长度而是占据几个字节 超过8位后自己按照8位一组一byte再扩容 统计字节数占用多少
127.0.0.1:6379> strlen sign
# bitcount <key> [start end] ] 统计字符串从 start 字节到 end 字节比特值为 1 的数量
127.0.0.1:6379> bitcount sign 6
# bitop and(or/not/xor) <destkey> [key…]
# bitop 是一个复合操作, 它可以做多个 Bitmaps 的 and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在 destkey 中
8.HyperLogLog
Redis在2.8.9版本添加了HyperLogLog 结构。
HyperLogLog 是 Redis 提供的一种用于基数统计的数据结构,它可以用来估算集合中不重复元素的数量。HyperLogLog 的优点是内存消耗固定且很小(标准情况下为 12KB),与集合中元素的数量无关,适合处理大规模数据集。HyperLogLog 提供的结果是一个近似值,标准误差为 0.81%。
使用场景包括但不限于:
- 统计独立访客数(UV)。
- 统计应用的日活跃用户数(DAU)或月活跃用户数(MAU)。
- 统计用户搜索不同词条的数量。
- 统计注册 IP 数量。
HyperLogLog 只能提供不精确的去重计数方案,且不能返回集合中的元素本身。因此,它适用于对精度要求不是非常高的场景,而在需要精确计数时,可能需要考虑其他数据结构或方法
# pfadd <key> <element> [element ...] 添加指定元素到 HyperLogLog 中
127.0.0.1:6379> pfadd name redis
# pfcount<key> [key ...] 计算 HLL 的近似基数,可以计算多个 HLL,比如用 HLL 存储每天的 UV,计算一周的 UV 可以使用 7 天的 UV 合并计算即可
127.0.0.1:6379> pfcount name
# pfmerge <destkey> <sourcekey> [sourcekey ...] 将一个或多个 HLL 合并后的结果存储在另一个 HLL 中,比如每月活跃用户可以使用每天的活跃用户来合并计算可得
127.0.0.1:6379> pfmerge name name2
9.Geospatial
Redis 的 Geospatial 功能是 Redis 3.2 版本引入的一种用于处理地理空间数据的数据类型。它允许用户存储地理位置信息,并执行一些地理相关的操作,如计算两个地点之间的距离、查找给定半径内的所有地点等。
Redis Geospatial 使用的是有序集合(sorted sets)来存储地理位置信息,并通过 Geohash 编码来实现地理位置的索引和查询
# geoadd <key> <longitude> <latitude> <member> [longitude latitude member...] 添加地理位置(经度,纬度,名称)
# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
# redis-cli --raw 解决乱码
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen 116.38 39.90 beijing
# geopos <key> <member> [member...] 获得指定地区的坐标值
127.0.0.1:6379> geopos china:city beijing
# geodist <key> <member1> <member2> [m|km|ft|mi ] 获取两个位置之间的直线距离
# 单位:
# m 表示单位为米[默认值]。
# km 表示单位为千米。
# mi 表示单位为英里。
# ft 表示单位为英尺。
# 如果用户没有显式地指定单位参数, 那么GEODIST 默认使用米作为单位
127.0.0.1:6379> geodist china:city beijing shanghai km
# georadius <key> <longitude> <latitude> radius m|km|ft|mi 以给定的经纬度为中心,找出某一半径内的元素
# WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回
# WITHCOORD: 将位置元素的经度和维度也一并返回。
# WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
# COUNT 限定返回的记录数
# ASC: 查找结果根据距离从近到远排序
# DESC: 查找结果根据从远到近排序
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
# georadiusbymember 根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合
# georadiusbymember与georadius用法类似,只不过把参数经纬度改成了存在key里的member成员而已
127.0.0.1:6379> georadiusbymember china:city chengdu 300 km
# geohash 返回一个或多个位置对象的 geohash 值,该命令将返回11个字符的Geohash字符串!
# 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!
127.0.0.1:6379> geohash china:city beijing chongqi
1) "wx4fbxxfke0"
2) "wm5xzrybty0"