Redis
简介
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储数据库,支持多种数据结构(如字符串、哈希、列表、集合等)。它通常用作缓存、消息队列或实时数据处理系统,具有高性能、低延迟和持久化特性。
Redis属于非关系型数据库,数据直接存储在内存中
它的存储方式是key-value型式,和Java中的map结构差不多
Redis常用于点赞,投票,全局id,分布式锁,缓存数据库中的数据,减轻数据库的压力,以及登录的时候存储token令牌等
Redis的数据类型:String/list/set/zset/hash/bitmap/geo/stream/hyperloglog等
最常用的是一下五种:
String:最常用的一种类型
list:list虽然和Java中的list名字一样,但是它们本质其实是不一样的,不要用在Java中对list的思想来理解Redis中的list
hash:可以用来做投票等
zset,set
Redis命令 [常用命令]
String命令
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379>
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> mset qq 123456 wx rr123456
OK
127.0.0.1:6379> get qq
"123456"
127.0.0.1:6379> get wx
"rr123456"
127.0.0.1:6379> mget name age qq
1) "zhangsan"
2) "20"
3) "123456"
# nx, not exists 简写
# 如果key不存在,创建key-value,如果存在,直接返回
# 实现分布式锁机制
127.0.0.1:6379> setnx height 180
(integer) 1
127.0.0.1:6379> setnx height 170
(integer) 0
# 向value追加数据
127.0.0.1:6379> append name 123
(integer) 11
127.0.0.1:6379> get name
"zhangsan123"
# 自增 针对value是数字的情况
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> get age
"21"
127.0.0.1:6379> incr id
(integer) 1
127.0.0.1:6379> get id
"1"
# 自减
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379> get age
"20"
# 指定增幅
127.0.0.1:6379> incrby age 5
(integer) 25
127.0.0.1:6379> incrby age -1
(integer) 24
# 减
127.0.0.1:6379> decrby age 2
(integer) 22
127.0.0.1:6379> decrby age -1
(integer) 23
# 创建key-value,并且设置过期时间
127.0.0.1:6379> setex token 60 qeqeqeq1321qeq
OK
创建key-value,并且设置过期时间]
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379>
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> mset qq 123456 wx rr123456
OK
127.0.0.1:6379> get qq
"123456"
127.0.0.1:6379> get wx
"rr123456"
127.0.0.1:6379> mget name age qq
1) "zhangsan"
2) "20"
3) "123456"
# nx, not exists 简写
# 如果key不存在,创建key-value,如果存在,直接返回
# 实现分布式锁机制
127.0.0.1:6379> setnx height 180
(integer) 1
127.0.0.1:6379> setnx height 170
(integer) 0
# 向value追加数据
127.0.0.1:6379> append name 123
(integer) 11
127.0.0.1:6379> get name
"zhangsan123"
# 自增 针对value是数字的情况
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> get age
"21"
127.0.0.1:6379> incr id
(integer) 1
127.0.0.1:6379> get id
"1"
# 自减
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379> get age
"20"
# 指定增幅
127.0.0.1:6379> incrby age 5
(integer) 25
127.0.0.1:6379> incrby age -1
(integer) 24
# 减
127.0.0.1:6379> decrby age 2
(integer) 22
127.0.0.1:6379> decrby age -1
(integer) 23
# 创建key-value,并且设置过期时间
127.0.0.1:6379> setex token 60 qeqeqeq1321qeq
OK
针对key的通用命令
# 获取所有key
127.0.0.1:6379> keys *
1) "wx"
2) "height"
3) "age"
4) "name"
5) "id"
6) "qq"
# 判断key是否存在
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists aaa
(integer) 0
# 删除key
127.0.0.1:6379> del id
(integer) 1
# key设置过期时间,单位秒
127.0.0.1:6379> expire qq 60
(integer) 1
# 查看剩余的过期时间
127.0.0.1:6379> ttl qq
(integer) 53
127.0.0.1:6379> ttl qq
(integer) 47
# 查看value对应的类型
127.0.0.1:6379> type name
string
127.0.0.1:6379> type age
string
list数据类型 命令(一般作为队列来使用)
# 从左边添加元素
127.0.0.1:6379> lpush queue aaa bbb ccc
(integer) 3
# 从右边添加元素
127.0.0.1:6379> rpush queue ttt yyy
(integer) 5
# 查看指定范围的元素, -1表示结尾
127.0.0.1:6379> lrange queue 0 -1
1) "ccc"
2) "bbb"
3) "aaa"
4) "ttt"
5) "yyy"
127.0.0.1:6379> lrange queue 0 3
1) "ccc"
2) "bbb"
3) "aaa"
4) "ttt"
# 从左边取元素
127.0.0.1:6379> lpop queue
"ccc"
# 获取元素个数
127.0.0.1:6379> llen queue
(integer) 4
# 从右边取元素
127.0.0.1:6379> rpop queue
"yyy"
127.0.0.1:6379> llen queue
(integer) 3
# 设置指定索引处的元素,索引从0开始
127.0.0.1:6379> lset queue 2 ooo
OK
127.0.0.1:6379> lrange queue 0 -1
1) "bbb"
2) "aaa"
3) "ooo"
# 删除指定个数的元素
127.0.0.1:6379> lrem queue 1 aaa
(integer) 1
127.0.0.1:6379> lrange queue 0 -1
1) "bbb"
2) "ooo"
127.0.0.1:6379> lpush aaa ccc aaa
(integer) 2
127.0.0.1:6379> lrange queue 0 -1
1) "bbb"
2) "ooo"
127.0.0.1:6379> lpush queue aaa ccc aaa
(integer) 5
127.0.0.1:6379> lrange queue 0 -1
1) "aaa"
2) "ccc"
3) "aaa"
4) "bbb"
5) "ooo"
127.0.0.1:6379> lrem queue 2 aaa
(integer) 2
127.0.0.1:6379> lrange queue 0 -1
1) "ccc"
2) "bbb"
3) "ooo"
127.0.0.1:6379> type queue
list
127.0.0.1:6379>
set(无序集合,元素不能重复)
# set中添加元素
127.0.0.1:6379> sadd like:uid 123 234 111
(integer) 3
# 获取所有元素
127.0.0.1:6379> smembers like:uid
1) "111"
2) "123"
3) "234"
# 元素个数
127.0.0.1:6379> scard like:uid
(integer) 3
# 判断是否存在某个元素
127.0.0.1:6379> sismember like:uid 111
(integer) 1
127.0.0.1:6379> sismember like:uid 000
(integer) 0
# 删除元素
127.0.0.1:6379> srem like:uid 111
(integer) 1
127.0.0.1:6379> smembers like:uid
1) "123"
2) "234"
127.0.0.1:6379> sadd like:uuu 123 444 555
(integer) 3
# 求交集,还有求并集
127.0.0.1:6379> sinter like:uid like:uuu
1) "123"
127.0.0.1:6379>
127.0.0.1:6379> type like:uid
set
zset(有序集合,根据score进行排序)
# 添加元素,指定score, 可以是整数、浮点数
127.0.0.1:6379> zadd music 100 m1 120 m2
(integer) 2
# 查看指定索引范围的数据,根据score升序
127.0.0.1:6379> zrange music 0 -1
1) "m1"
2) "m2"
127.0.0.1:6379> zrange music 0 -1 withscores
1) "m1"
2) "100"
3) "m2"
4) "120"
127.0.0.1:6379> zadd music 90 m3
(integer) 1
127.0.0.1:6379> zrange music 0 -1 withscores
1) "m3"
2) "90"
3) "m1"
4) "100"
5) "m2"
6) "120"
# 获取降序的数据
127.0.0.1:6379> zrevrange music 0 -1 withscores
1) "m2"
2) "120"
3) "m1"
4) "100"
5) "m3"
6) "90"
# 获取指定分数范围的数据个数
127.0.0.1:6379> zcount music 100 200
(integer) 2
# 所有元素个数
127.0.0.1:6379> zcard music
(integer) 3
# 删除元素
127.0.0.1:6379> zrem music m1
(integer) 1
127.0.0.1:6379> zrange music 0 -1 withscores
1) "m3"
2) "90"
3) "m2"
4) "120"
# 修改指定元素的score
127.0.0.1:6379> zincrby music 2.5 m3
"92.5"
127.0.0.1:6379> type music
zset
127.0.0.1:6379>
hash(value对应hash结构,field-value)
比如可以存储用户信息,存储某一天,某些文章的点赞数等等…
# 向hash中添加数据
127.0.0.1:6379> hset user name hehe
(integer) 1
127.0.0.1:6379> hset user age 30
(integer) 1
# 根据key,field获取数据
127.0.0.1:6379> hget user name
"hehe"
# 添加多个数据
127.0.0.1:6379> hmset user gender male height 180
OK
127.0.0.1:6379> hmget user name age
1) "hehe"
2) "30"
# hash中所有元素个数
127.0.0.1:6379> hlen user
(integer) 4
# 获取所有元素
127.0.0.1:6379> hgetall user
1) "name"
2) "hehe"
3) "age"
4) "30"
5) "gender"
6) "male"
7) "height"
8) "180"
# 获取所有的key
127.0.0.1:6379> hkeys user
1) "name"
2) "age"
3) "gender"
4) "height"
# 获取所有的value
127.0.0.1:6379> hvals user
1) "hehe"
2) "30"
3) "male"
4) "180"
# 根据key/field进行增加值的操作
127.0.0.1:6379> hincrby user age 5
(integer) 35
127.0.0.1:6379> hget user age
"35"
127.0.0.1:6379> hincrby user age -2
(integer) 33
# 根据key/field删除元素
127.0.0.1:6379> hdel user gender
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "hehe"
3) "age"
4) "33"
5) "height"
6) "180"
127.0.0.1:6379> type user
hash
127.0.0.1:6379>
bitmap[了解会用即可]
位图,按照bit位存储0 1的数据(Redis 中一个字符串类型的值最多能存储 512 MB 的内容,每个字符串由多个字节组成,每个字节又由 8 个 Bit 位组成。位图结构正是使用“位”来实现存储的,它通过将比特位设置为 0 或 1来达到数据存取的目的,这大大增加了 value 存储数量,它存储上限为2^32
。)
经常被用作存储签到信息
本质上还是字符串
# 按照bit位,设置指定偏移量的值
127.0.0.1:6379> setbit sign:123 0 1
(integer) 0
127.0.0.1:6379> setbit sign:123 3 1
(integer) 0
# 获取某位的值
127.0.0.1:6379> getbit sign:123 0
(integer) 1
127.0.0.1:6379> getbit sign:123 1
(integer) 0
127.0.0.1:6379> getbit sign:123 5
(integer) 0
127.0.0.1:6379> type sign:123
string
# 获取1的个数
127.0.0.1:6379> bitcount sign:123
(integer) 2
# 位域,获取指定范围的bit位的数据,内部转为10进制数据返回
127.0.0.1:6379> bitfield sign:123 get u4 0
1) (integer) 9
127.0.0.1:6379> bitfield sign:123 get u5 0
1) (integer) 18
geo(一般用来存储经纬度坐标用)
# 添加经纬度坐标
127.0.0.1:6379> geoadd travel 113.642957 34.725775 addr1 113.582217 34.809100 addr2
(integer) 2
# 获取某个元素的坐标
127.0.0.1:6379> geopos travel addr2
1) 1) "113.58221501111984253"
2) "34.8090988236580543"
# 计算两点的距离
127.0.0.1:6379> geodist travel addr1 addr2 km
"10.8025"
# 获取指定半径范围的元素
127.0.0.1:6379> georadius travel 113.642957 34.72468 3 km
1) "addr1"
127.0.0.1:6379> georadius travel 113.642957 34.72468 10 km
1) "addr1"
127.0.0.1:6379> georadius travel 113.642957 34.72468 100 km
1) "addr1"
2) "addr2"
127.0.0.1:6379> type travel
zset
HyperLogLog(基数统计)
统计不重复数据的元素个数,存在一定的误差,它并不会真正的存储数据
# 添加元素
127.0.0.1:6379> pfadd uv 111 222 333 444
(integer) 1
# 统计个数
127.0.0.1:6379> pfcount uv
(integer) 4
127.0.0.1:6379> type uv
string
数据的持久化[重点]
rdb 快照
默认dump.rdb,它存储的是二进制信息,相当于给数据拍了一张照片存储在磁盘上面
Redis快照(RDB)是一种将内存数据在某一时刻的状态保存到磁盘上的持久化方式。通过生成快照,可以在Redis重启时恢复数据,避免因进程退出导致的数据丢失。
AOF 持久化
内部存储的是操作Redis的命令,把执行的所有写入命令都记录下来