1.Redis 简介
Redis 是我们在互联网应用中使用最广泛的一个 NoSQL 数据库,基于 C 开发的键值对存储数据库,Redis 这个名字是 Remote Dictionary Service 字母缩写。很多人想到 Redis,就想到缓存。但实际上 Redis 除了缓存之外,还有许多更加丰富的使用场景。比如分布式锁,限流。
特点:
- 支持数据持久化
- 支持多种不同的数据结构类型之间的映射
- 支持主从模式的数据备份
- 自带了发布订阅系统
- 定时器、计数器
2.Redis 安装
四种方式获取一个 Redis:
- 直接编译安装(推荐使用)
- 使用 Docker
- 也可以直接安装
- 还有一个在线体验的方式,通过在线体验,可以直接使用 Redis 的功能https://try.redis.io/
3.Redis 五种基本数据类型
Redis 启动
首先,修改 redis.conf 配置文件:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0e79a2fbcd43c0d5bdff835f47ff4bea.png)
配置完成后,保存退出,再次通过 redis-server redis.conf 命令启动 Redis,此时,就是在后台启动了。
1.String
String 是 Redis 里边最最简单的一种数据结构。在 Redis 中,所以的 key 都是字符串,但是,不同的key 对应的 value 则具备不同的数据结构,我们所说的五种不同的数据类型,主要是指 value 的数据类型不同。
Redis 中的字符串是动态字符串,内部是可以修改的,像 Java 中的StringBuffer,它采用分配冗余空间的方式来减少内存的频繁分配。在 Redis 内部结构中,一般实际分配的内存会大于需要的内存,当字符串小于 1M 的时候,扩容都是在现有的空间基础上加倍,扩容每次扩 1M 空间,最大512M
常用命令 | 说明 |
---|
set | set 就是给一个 key 赋值的。 |
append | 使用 append 命令时,如果 key 已经存在,则直接在对应的 value 后追加值,否则就创建新的键值对。 |
decr | 可以实现对 value 的减 1 操作(前提是 value 是一个数字),如果 value 不是数字,会报错,如果value 不存在,则会给一个默认的值为 0,在默认值的基础上减一。 |
decrby | 和 decr 类似,但是可以自己设置步长,该命令第二个参数就是步长。 |
get | get 用来获取一个 key 的 value。 |
getrange | getrange 可以用来返回 key 对应的 value 的子串,这有点类似于 Java 里边的 substring。这个命令第二个和第三个参数就是截取的起始和终止位置,其中,-1 表示最后一个字符串,-2 表示倒数第二个字符串,以此类推。 |
getset | g获取并更新某一个 key。 |
incr | 给某一个 key 的 value 自增。 |
incrby | 给某一个 key 的 value 自增,同时还可以设置步长。 |
incrbyfloat | 和 incrby 类似,但是自增的步长可以设置为浮点数。 |
mget 和 mset | 批量获取和批量存储。 |
ttl | 查看 key 的有效期。 |
setex | 在给 key 设置 value 的同时,还设置过期时间。 |
psetex | 和 setex 类似,只不过这里的时间单位是毫秒。 |
setnx | 默认情况下, set 命令会覆盖已经存在的 key,setnx 则不会。 |
msetnx | 批量设置。 |
setrange | 覆盖一个已经存在的 key 的value。 |
strlen | 查看字符串长度。 |
BIT 命令
在 Redis 中,字符串都是以二进制的方式来存储的。例如 set k1 a,a 对应的 ASCII 码是 97,97 转为
二进制是 01100001,BIT 相关的命令就是对二进制进行操作的。
常用命令 | 说明 |
---|
getbit | key 对应的 value 在 offset 处的 bit 值。 |
setbit | 修改 key 对应的 value 在 offset 处的 bit 值 |
bitcount | 统计二进制数据中 1 的个数 |
2.List
常用命令 | 说明 |
---|
lpush | 将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误 |
lrange | 返回列表指定区间内的元素 |
rpush | 向存于 key 的列表的尾部插入所有指定的值。 |
rpop | 移除并返回列表的尾元素。 |
lpop | 移除并返回列表的头元素。 |
lindex | 返回列表中,下标为 index 的元素 |
ltrim | ltrim 可以对一个列表进行修剪。 |
blpop | 阻塞式的弹出,相当于 lpop 的阻塞版。 |
3.Set
常用命令 | 说明 |
---|
sadd | 添加元素到一个 key 中 |
smembers | 获取一个 key 下的所有元素 |
srem | 移除指定的元素。 |
sismember | 返回某一个成员是否在集合中。 |
scard | 返回集合的数量。 |
srandmember | 随机返回一个元素 |
spop | 随机返回并且出栈一个元素。 |
smove | 把一个元素从一个集合移到另一个集合中去。 |
sdiff | 返回两个集合的差集。 |
sinter | 返回两个集合的交集。 |
sdiffstore | 这个类似于 sdiff ,不同的是,计算出来的结果会保存在一个新的集合中。 |
sinterstore | 类似于 sinter,只是将计算出来的交集保存到一个新的集合中。 |
sunion | 求并集。 |
sunionstore | 求并集并且将结果保存到新的集合中。 |
4.Hash
**在 hash 结构中,key 是一个字符串,value 则是一个 key/value 键值对。**
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b741e0f612d9d324dff125bed94c6753.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c9b56648958848b4ec88ddd432915777.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/af2973ebb2f218deb2ec25f7b3ac94b5.png)
常用命令 | 说明 |
---|
hset | 添加值。 |
hget | 获取值 |
hmset | 批量设置。 |
hmget | 批量获取。 |
hdel | 删除一个指定的 field。 |
hsetnx | 默认情况下,如果 key 和 field 相同,会覆盖掉已有的 value,hsetnx 则不会。 |
hvals | 获取所有的 value。 |
hkeys | 获取所有的 key。 |
hgetall | 同时获取所有的 key 和 value。 |
hexists | 返回 field 是否存在。 |
hincrby | 给指定的 value 自增。 |
hincrbyfloat | 可以自增一个浮点数。 |
hlen | 返回 某一个 key 中 value 的数量。 |
hstrlen | 返回某一个 key 中的某一个 field 的字符串长度。 |
5.ZSet
常用命令 | 说明 |
---|
zadd | 将指定的元素添加到有序集合中。 |
zscore | 返回 member 的 score 值 |
zrange | 返回集合中的一组元素。 |
zrevrange | 返回一组元素,但是是倒序。 |
zcard | 返回元素个数。 |
zcount | 返回 score 在某一个区间内的元素。 |
zrangebyscore | 按照 score 的范围返回元素。 |
zrank | 返回元素的排名(从小到大)。 |
zrevrank | 返回元素排名(从大到小)。 |
zincrby | score 自增。 |
zinterstore | 给两个集合求交集。 |
zrem | 弹出一个元素。 |
zlexcount | 计算有序集合中成员数量。 |
zrangebylex | 返回指定区间内的成员。 |
6.key
常用命令 | 说明 |
---|
del | 删除一个 key/value。 |
dump | 序列化给定的 key |
exists | 判断一个 key 是否存在。 |
ttl | 查看一个 key 的有效期。 |
expire | 给一个 key 设置有效期,如果 key 在过期之前被重新 set 了,则过期时间会失效。 |
persist | 移除一个 key 的过期时间。 |
keys * | 查看所有的 key。 |
pttl | 和 ttl 一样,只不过这里返回的是毫秒。 |
7.补充
- 四种数据类型(list/set/zset/hash),在第一次使用时,如果容器不存在,就自动创建一个
- 四种数据类型(list/set/zset/hash),如果里边没有元素了,那么立即删除容器,释放内存。