一、Redis基础知识
1、基本数据结构
key - value;
可以理解为一个大的hashMap;
2、体系知识
2大维度:应用、底层原理;
3大主题:高性能、高可用、高扩展;
3、Redis 缓存的作用
redis并发量高,有效降低数据库压力;
可以实现一个排行榜;value -- 列表、有序集合(set zset);
计数器(限流);浏览次数、视频(播放量、点赞量、关注量)
社交网络:消息、IM中台系统(redis<查询>、MQ<数据异构问题>)
消息队列(MQ):发布订阅,参考kafka的设计;
二、基本命令
1、Linux 安装 Redis 命令
创建目录:mkdir /usr/local/redis
解压文件:tar -zvxf redis-7.2.4.tar.gz -C ../../../usr/local/redis
开启服务:/src/redis-server
检查服务:ps -ef | grep redis
打开客户端:/src/redis-cli
2、Redis的bin目录下的可执行文件
3、启动
ps -ef|grep redis // 检查是否启动redis
./redis-server ../redis-6.2.7/redis.conf // 以redis.conf配置文件启动redis服务
./redis-cli // 打开redis客户端
4、停用
shutdown
./redis-cli -p 6379 shutdown
5、库
Redis一共有16个库,分别是0~15;常用0库
6、key的命名规则
业务名称_对象名_id
key的长度不宜太长;
7、全局命令
① 查询命令
命令 | 作用 |
keys * | 查看所有键(不推荐使用) |
keys a* | 模糊查询键 |
dbsize | 查看key数量 |
exists key | 检查键是否存在 |
ttl key | 查看过期时长 5s; 返回: -2表示键不存在; -1表示键没设置过期时间; 0 表示刚好过期; |
type key | 查看value的数据类型 |
randomkey | 随机返回一个已经存在的key |
mget key1 key2 ... | 同时查询多个key的value |
strlen key | 查询value的字节数 |
getset key1 key2 key3 |
② 写入命令
命令 | 作用 |
expire key 5s pexpire key 5000ms 毫秒 expireat key 时间戳 | 设置过期时长; 不能对value设置过期时长;只能对key设置过期时长; |
set key value | 添加一个键值对; 坑: 1、如果key存在,就覆盖它的值; 2、如果这个key存在并且设置了过期时间,那么这个key的过期时间重置为永不过期; |
setnx key value set key value nx | 添加键值对; 如果key存在就不让添加; |
set key value xx | 添加键值对; 如果key不存在就添加不了; |
append key value | 给value后面追加字符串 |
mset key1 value1 key2 value2 ... | 同时添加多个键值对; |
rename name1 name2 | 修改键名称 name1 -> name2; 但是如果name2已存在,会先删除name2,再做修改;name2的值会丢失; |
renamenx name1 name2 | 修改键名称 name1 -> name2; 如果name2已存在,就返回0;表示name2已存在,不让修改; |
③ 删除命令
命令 | 作用 |
del key | 删除键值对 |
三、Redis基础数据类型
1、基础数据类型
key一定是String;value的基础类型有5种:
字符串 | hash | List | set(无序集合) | zset(有序集合) |
2、字符串类型 String
Redis自己实现了一个String,不是用C语言提供的;
最大是512M;
① 使用场景:共享session、计数器
计数器 | |
整数计数器: incr key-name //计数器自增 1 incrby key-name 3 //计数器加 3 decr key-name //计数器自增 -1 decrby key-name 3 //计数器加 -3 get key-name //获取计数器 | 浮点数计数器: (incr-by-float) incrbyfloat key-name 0.5 //计数器加 0.5 |
② 字符串其他操作
字符串其他操作 | |
命令 | 作用 |
getset key value | 先查询key的旧value; 再给key覆盖上新的value; |
setrange key 5 value | 在key的旧value上的第5个位置覆盖一个字符串; |
getrange key 0 5 | 查询key的value的截取字符串; 第0位 ~ 第4位; |
3、Hash类型
① 结构
key: String
value: HashMap<String,String>
② 命令
命令 | 作用 |
hset key name value | 添加一条记录; 设置一个属性; |
hmset key name1 value1 name 2 value2 | 添加一条记录; 可以同时设置多个属性; |
hsetnx key name value | 添加一条记录; 如果key已存在则不覆盖; |
hget key name | 查询记录; key的name属性; |
hlen key | 查询key的属性数量; |
hmget key name1 name2 name3 | 批量查询key的多个属性; |
hexists key name | 查询key是否有name属性; |
hkeys key | 查询key的所有属性; |
hvals key | 查询key的所有属性值; |
hgetall key | 查询key的全部属性和属性值; 返回值以键值对成对返回; |
hincrby key id 2 | 给key的id属性的值做+2操作; |
③ String 与 Hash 的使用场景
String | 优点:
|
缺点:键数过多,占用内存多,对象信息过于分散,不用于生产环境; | |
将对象序列化(JSON)存入String | 优点:编程简单; |
缺点:
| |
使用Hash类型 | 优点:
|
缺点:
|
4、List
① 特点
最大元素个数:(232 - 1)个;
元素有序,可以根据下标查询(单个、区间);
可以两头插入元素;
可以插入重复的元素;
② 命令
命令 | 作用 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5、Set
① 特点
最大元素个数:(232 - 1)个;
无序;
不允许重复;
② 命令
命令 | 作用 |
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
③ 应用场景
打标签:找兴趣相同的好友;
6、ZSet
① 特点
元素有序;
② 结构
[分数|元素] -> [score|member]
③ 命令
命令 | 作用 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|