环境配置
1.windows环境
windows
环境仅用于学习使用,项目中请使用Linux
环境
参考文章:Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)
下载链接:https://github.com/tporadowski/redis/releases (版本有点低)
下载完成后解压文件,在Redis
所在文件夹中使用cmd
,输入:
1
redis-server.exe redis.windows.conf
来启动redis
程序。
之后可以选择将Redis
路径加入系统环境变量里的Path
变量中,之后测试
通过下述命令行打开redis
客户端:
1
redis-cli.exe -h 127.0.0.1 -p 6379
可以通过ping
来测试,如果返回了pong
则表明连接成功。
如果出现Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。
请保持redis
运行再重试。
2.linux环境
待开坑………..
一.数据类型
本文档的// value
注释表示同一代码块中代码的返回值,多个返回值之间用分号;
隔开,或数据过长则用换行隔开。
Redis
中的数据类型有:
数据类型 | 名称 |
---|---|
String | 字符串 |
List | 列表 |
Hash | 哈希表 |
Set | 集合 |
Sorted Set / Zset | 有序集合 |
Geospatial / GEO | 地理空间 |
HyperLogLog | 基数统计 |
bitmap | 位图 |
bitfield | 位域 |
Stream | 流 |
指令查询:https://redis.io/commands
此处先介绍一下Redis
的基础查询:
Keys
是Redis
最常用的查询指令,其中常用的Keys
指令有
Keys指令 | 查询内容 |
---|---|
keys * | 查询当前库中所有key |
exists key | 查询某个Key是否存在于当前库,并返回对应的数量,可传入多个Key |
type key | 查询某个Key的类型 |
del key | 删除某个Key,可传入多个Key |
unlink key | 非阻塞删除,防止线程阻塞 |
ttl key | 查看某个key还有多少秒过期,-1表示永不过期,-2表示已过期 |
expire key | 为给定的key设置过期时间 |
move key dbindex | 将当前数据库的key移动到给定数据库中,redis默认有16个库,编号为 0 ~ 15 |
dbsize | 当前数据库的key的数量 |
flushdb | 清空当前库 |
flushall | 通杀全部库 |
Redis
的命令是大小写不敏感的,而key
是大小写敏感的,大小写不同而字母相同的key会被视为不同的key。
一.String
1.Set命令
字符串的常规指令格式为
1
SET key value [NX | XX] EX number
其中,NX
为创建新key
,而EX
为更新对应key
的值。若不填该项则是二者兼有,即没有则创建,有则更改。
EX number
则是为对应key
的值设置过期时间,EX
即为expire
的缩写。
此外,可以通过MSET
来批量的进行SET
指令:
1
2
3
4
MSET K1 V1 K2 V2 K3 V3
//带入NX作用的MSET
MSETNX K1 V1 K2 V2
此外,还有MGET
来实现批量查询,如:
1
MGET K1 K2 K3
此外,存在SETEX
指令可以将SET
与EXPIRE
两个指令合为一个原子指令。但该指令之后被SET ... EX ...
替代了。
1
SETEX key number value
GETSET
指令可以先实现GET
指令,再通过SET
更改其值。
1
2
3
4
5
set k1 origin
getset k1 outer
get k1
// value : origin ; outer
2.Range命令
RANGE
命令分为GETRANGE
和SETRANGE
,其中GETRANGE
用于返回索引范围内的字符串切片。
1
2
3
4
SET K1 0123456789
GETRANGE K1 0 6
// VALUE : 0123456
而SETRANGE
则可以根据索引替换对应的字符串内容
1
2
3
4
SET K1 0123456789
SETRANGE K1 0 abcde
get K1
// VALUE : abcde56789
3.数值增减
INCR
指令可以将对应key
的value
值自增并返回其值
1
2
3
4
5
SET k1 100
INCR k1
INCR k1
// VALUE : 102
同理,DECR
则是自减并返回。
如果应用于非整数类型,则会报错:ERR value is not an integer or out of range
。
4.字符串操作
STRLEN
返回字符串的长度,APPEND
在字符串最后附加内容。
1
2
3
4
5
6
7
SET K1 100
STRLEN k1
APPEND k1 ABC
STRLEN K1
get k1
// VALUE : 3 ; 6 ; 100ABC
二.List
List
的底层为双向链表。
1.Push命令
在Redis
中,定义List
需要使用Push
指令,存在lpush
与rpush
,分别为从左向右压入和从右往左压入。
1
2
3
4
5
6
7
8
9
10
11
12
lpush l1 1 2 3 4 5
rpush l2 1 2 3 4 5
type l1
lrange l1 0 -1
lrange l2 0 -1
// value :
list
5 4 3 2 1
1 2 3 4 5
其中lrange
是依据索引范围从左向右遍历。
2.Pop命令
lpop
与rpop
分别为从左向右与从右向左弹出第一个元素。
此处只演示lpop
,rpop
与之同理。
1
2
3
4
5
lpop l1
LRANGE l1 0 -1
// value :
4 3 2 1
rpoplpush
能将第一个数组的最右边元素从左边压入第二个数组
1
2
3
4
5
6
7
8
9
rpush l1 0 1 2 3
rpush l2 4 5 6 7
RPOPLPUSH l1 l2
lrange l2 0 -1
lrange l1 0 -1
// value :
l1 : 0 1 2
l2 : 3 4 5 6
如上述代码,其将l1
的最右侧元素3
弹出后,从左侧压入了l2
。
3.其余命令
此处介绍常用的List
从左到右操作:Lindex
、Llen
、Lrem
、Ltirm
、Lset
、Linsert
LINDEX
命令通过从左到右的索引获取对应的值:
1
2
3
4
rpush l2 0 1 2 3 4 5
lindex l2 3
// value : 3
LLEN
可以获取列表中元素的个数,实际上lpush
或rpush
的返回值便是LLEN
。
LREM
可以从左到右删除给定数量个给定元素,通常用于去重操作,如:
1
2
3
4
5
rpush l3 1 1 1 1 1 2 3 4 5
lrem l3 4 1
lrange l3 0 -1
// value : 1 2 3 4 5
LTRIM
用于获取索引范围内的列表切片 (此处是比喻,Redis
并没有切片类型)
1
2
3
4
5
rpush l2 0 1 2 3 4 5
ltrim l2 1 4
lrange l2 0 -1
// value : 1 2 3 4
LSET
用于从左向右根据索引来设置某一元素的值。
1
2
3
4
5
rpush l1 0 1 2 3 4 5
lset l1 1 a
lrange l1 0 -1
// value : 0 a 2 3 4 5
LINSERT
通过名称检索元素,并选择在该元素之前还是之后插入某个新元素,语法为LINSERT list [BEFORE | AFTER] old new
,其中old
为已存在的元素,new
为要插入的新元素
1
2
3
4
5
6
rpush l1 gin gorm grpc gozero casbin
LINSERT l1 before gozero redis
lrange l1 0 -1
// value :
gin gorm grpc redis gozero casbin
三.Hash
Hash
数据类型可以理解为map[String]Object
1.Set/Get命令
Hash
类型只需要hset
和hget
即可进行设置和查询
1
2
3
4
hset user1 id 1 name Outer age 19
hget user1 name
// value : Outer
同理,还有HMSET
与HMGET
来处理多个参数的情况。
HMSET
与HSET
效果一致,已弃用,此处不再展示。
1
2
3
4
5
HSET user1 id 1 name Outer age 19
HMGET user1 id name age
// value :
1 ; Outer ; 19
我们也可以直接通过HGETALL
来获取全部的字段,其会遍历并返回所有的字段。
与其效果类似的有HKEY
和HVALS
,HKEY
会返回所有KEY
,即字段名,而HVALS
则会返回所有VALUE
值,即字段对应的值。
HSETNX
即HSET
的NX
版本,若字段不存在则创建,若已存在则不会进行更改。
2.其余命令
此处介绍HLEN
、HEXISTS
、HINCRBY
。
指令 | 作用 |
---|---|
HLEN | 可以返回当前Hash 的键值对数量 |
HEXISTS | 判断一个字段是否存在 |
HINCRBY | 给对应的字段的值增加特定的整数 |
HINCRBYFLOAT | 给对应的字段的值增加特定的小数 |
1
2
3
4
5
6
HSET user1 id 1 name Outer age 19
HINCRBY user1 id 2
HGETALL user1
// value :
id 3 name Outer age 19
四.Set
Set
用于记录一组元素,将相同的元素归为一类。
Set
也是一种映射,其映射关系为map[string]int
,如果出现重复元素则int
值增加。
1.Set/Get命令
SADD
用于向集合中添加元素。
SMEMBERS
用于查看某一集合内的元素。
SIMEMBERS
用于查看一个集合内是否存在某一元素。
SREM
用于删除某一元素。
SCARD
用于获取当前集合内某一元素的数量。
1
2
3
4
5
SADD SET1 1 1 1 2 2 2 3 4 5
SMEMBERS SET1
SISMEMBER SET1 X
SREM SET1 1
SCARD SET 2
2.其他指令
SRANDMEMEBR
用于从集合中随机展现设置的数字个数元素(不会删除),该过程不会重复。
SPOP
用于从集合中随机弹出一个元素(会删除)。
SMOVE
用于将一个集合中已存在的某个值赋给另一个集合。
1
2
3
4
5
SADD SET2 1 2 3 4 5 6 7 8
SRANDMEMBER SET2 7
// value :
8 7 6 2 4 5 3
如果SRANDMEMBER
后传入的值等于Set
内的元素数量,则其效果就与SMEMBER
一致。
SPOP
与SRANDMEMBER
效果一致,只是会删除元素。
SMOVE
可以将第一个集合中的某个元素移到第二个集合中。
1
2
3
4
5
6
7
8
9
SADD SET1 1 2 3 4
SADD SET2 5 6 7 8
SMOVE SET1 SET2 4
SMEMBERS SET1
SMEMBERS SET2
// value :
1 2 3 ;
4 5 6 7 8 ;
上述语句中,SMOVE
将SET1
中的4
移到了SET2
中。
3.集合运算
SDIFF
即A - B
,就是属于A而不属于B的元素。
SUNION
即 A ∪ B
,即 A 和 B 的并集。
SINTER
即 A ∩ B
,即 A 和 B 的交集。
五.ZSet
ZSet
是在Set
的基础上,给每一个Key
一个Score
值,并通过Score
进行排序。
ZSet
的大部分操作与Set
一致,此处只举例。
包括:ZADD ZCARD ZREM ZINCRBY
1
2
3
4
5
ZADD ZSET1 100 V1 200 V2 300 V3
ZRANGE ZSET1 0 -1 WITHSCORES
// value :
V1 100 V2 200 V3 300
ZRANGE
与LRANGE
效果一致,根据SCORE
从小到大进行遍历,且可以通过增加WITHSCORES
来设置是否显示分数。
与之相反的是ZREVRANGE
,其可以按从大到小的顺序遍历。
ZRANGEBYSCORE
的语法较为复杂。
ZRANGEBYSCORE set [ ( ] min max [ ) ] [WITHSCORES] [LIMIT start end]
其中,加(
或 )
表示开区间,即不包含顶点。
LIMIT start end
表示通过下标限制寻找的范围。
ZSCORE
可以获取对应元素的SCORE
值。
ZCOUNT
可以获取指定分数范围内的元素个数。
ZRANK
通过SCORE
的大小进行排序,并获取其对应字段的排名。
1
2
3
4
ZADD ZSET1 100 V1 200 V2 300 V3
ZRANK ZSET1 V3
// value : 2
六.bitmap
bitmap
的底层数据类型为String
类型。
SETBIT
可以指定更改对应位的比特值。
GETBIT
可以获取对应位的比特值。
1
2
3
4
5
SETBIT K1 1 1
SETBIT K1 7 1
GET K1
// value : A (即01000001 = 65)
STRLEN
可以获得bitmap
的字节数,不足一字节的会向上取整。
BITCOUNT
可以获取bitmap
的为1的比特位总数。
BITOP
可以对同一bitmap
的两个比特位进行与或非操作。
七.HyperLogLog
HyperLogLog
用于大基数数据去重,用于统计基数。
其对应的操作为PHADD
与PHCOUNT
1
2
3
4
PFADD HLL 1 2 3 4 5 5 5 5
PFCOUNT HLL
// value : 5
PFMERGE
用于将两个HyperLogLog
类型融合并返回一个新的HyperLogLog
类型。
1
2
3
4
5
6
PFADD HLL 1 2 3 4 5 5 5 5
PFADD HLL1 2 3 4 4 6 7
PFMERGE NEWHLL HLL HLL1
PFCOUNT NEWHLL
// value : 7
八.GEO
GEO
类型的底层数据类型为ZSET
通过GEOADD
来增加新的数据,如果有乱码就添加-- raw
,且作弊是以特殊的算法记录的,因此无法直接通过withscores
来获取坐标。
1
2
3
4
5
6
GEOADD city 116 39 "天安门"
ZRANGE city 0 -1 withscores
GEOPOS city "天安门"
// value : 天安门 4069047624061615 ;
116.00000113248825073 38.99999918434559731 ;
很明显的浮点数误差。
GEOHASH
可以获取对应键的哈希表示。
GEODIST
可以获取两个坐标之间的距离,并根据传入的参数来决定单位
1
2
3
4
GEOADD city 116 39 "天安门" 1 1 "北极"
GEODIST city "天安门" "北极" km
// value : 12068.7139
还有GEORADIUS
和GEORADIUSBYHMEMBER
等操作,由于GEO
数据类型应用范围实在有限,在此不作介绍。
九.Stream
应用场景有限,待开发…
十.bitfields
应用场景有限,待开发…