Redis介绍
Redis是一个开源的基于内存的键值对数据库
特征:
- 基于内存,读写速度极快,可以处理大量读写请求。
- 支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,具有丰富的数据表示能力
- 支持主从复制,提供数据冗余和故障恢复能力。
- 支持持久化,可以将内存数据保存到磁盘中。
- 支持事务,可以一次执行多个命令。
- 丰富的功能,可用于缓存、消息队列等场景。
场景:
- 缓存常见的使用场景,比如缓存查询结果、热点数据等,大大降低数据库负载。
- 处理大量的读写请求,比如访问统计、消息队列等。
- 排行榜、计数器等功能的实现。
- pub/sub消息订阅。
- QUE计划任务
- 分布式锁等。
文章目录
目录
一、Windows安装
- 下载本地并找到合适目录解压
- 双击 redis-server.exe 启动redis,如图则是成功
- 双击 redis-cli.exe 启动命令行窗口,如图则是成功
二、Linux安装Redis
1. 移动到服务器上并解压
tar zxvf redis-6.2.7.tar.gz
// 个人习惯,喜欢放在 /usr/local 目录下并改名,具体看自己
mv redis-6.2.7 /usr/local/redis
2. 检查本地是否有gcc环境
如果没有则
yum install gcc
3. 在redis目录下 进入src目录下并编译,此命令执行完,redis就编译完成了
cd src && make all
4.安装redis
make install PREFIX=/usr/local/redis
5. 进入redis目录下
./bin/redis-server redis.conf
6. 修改redis配置文件,让redis从后台启动
vim redis.conf
把此处的no改成yes
7.如果需要其他主机连接redis需要配置 bind * -::*()
- 进入vim之后,输入 /bind 即可查询
- 使用
n
键跳转到下一个搜索结果。 - 使用
N
键跳转到上一个搜索结果
8. redis设置密码
9.编写redis启动脚本(自用)
先创建一个脚本文档
vim redisStart.sh
把这个复制进去 : ./bin/redis-server redis.conf
最后添加权限
chmod +x redisStart.sh
执行启动
./redisStart.sh
查询进程
ps -ef |grep redis
最后直接使用ip地址加密码进行连接即可!
三、Redis通用命令
命令 | 详情 |
---|---|
select 1 | Redis默认拥有16个数据库,默认是0,切换到第二个数据库 |
DBSIZE | 查询当前库中key的数量 |
keys * | 获取所有的Key |
flushdb | 清除当前数据库 |
flushall | 清除所有数据库 |
exists key | 查询某个key是是否存在 |
move key 1 | 指定key移动到1号数据库 |
expire key 10 | 指定key 10秒 后过期 |
ttl key | 查看key还有多久过期 |
type key | 查看key是什么类型 |
四、五种数据结构类型
(1).String类型
- string类型的数据存储是最简单的key-value存储;
命令 | 详情 |
---|---|
set name wang | 设置key为name值为wang |
get name | 获取key为name的值 |
append name test | 拼接key为name的值: wangtest |
strlen name | 获取key为name的值长度 |
incr num | 设置key为num的值加1 |
decr num | 设置key为num的值减1 |
incrby num 10 | 设置key为num的值加10 |
decrby num 10 | 设置key为num的值减10 |
getrange name 0 3 | 截取下标为0-3的字符,例如:abcdef,截取后abcd |
setrange name 1 000 | 从下标为1进行替换字符串,例如:abcdef,替换后a000efg |
setex name 10 wang | 设置key为name的值为wang,10秒后过期 |
setnx age 18 | 如果age不存在,则设置age为18,如果存在则失败 |
mset k1 v1 k2 v2 | 一次性设置多个值 |
mget k1 k2 | 一次性取多个值 |
msetnx k1 v1 k3 v3 | 如果k1存在,则k1和k4全部设置失败, 此为事务的原子性 |
getset remark test | 如果remark不存在则设置并获取,如果存在则直接输入值 |
实战场景:
- 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
- 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
- session:常见方案spring session + redis实现session共享
(2).List集合类型
- List数据结构是链表结构、是双向的,是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。
命令 | 详情 |
---|---|
lpush zlist 1 | 往一个值或多个插入列表的左边 |
rpush zlist 1 | 往一个值或多个插入列表的右边 |
lrange zlist 0 5 | 获取集合区间的值 |
lpop zlist | 从左边移除一个元素 |
rpop zlist | 从右边移除一个元素 |
lindex zlist 0 | 通过下标获取集合中的某个值 |
llen zlist | 获取集合的长度 |
lrem zlist 1 2 | 移除集合中一个为2的,精确匹配 |
ltrim zlist 1 2 | 截取集合中下标为1-2之间的元素,并覆盖原来的集合 |
lset zlist 0 test | 更新集合中下标是0的值,不存在则报错 |
linsert zlist before 元素 某个值 | 在集合中给某个元素前新增一个值 |
linsert zlist after 元素 某个值 | 在集合中给某个元素后新增一个值 |
实战场景:
- 消息队列:reids的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。
- 文章列表或者数据分页展示的应用,每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。
(3).Set集合类型
- 不允许有重复的元素,
- 集合中的元素是无序的,不能通过索引下标获取元素,
- 支持集合间的操作,可以取多个集合取交集、并集、差集。
命令 | 详情 |
---|---|
sadd zset name | 往集合中添加一个元素 |
smembers zset | 查询集合中所有元素 |
srandmember zset 1 | 随机从集合中抽出1个元素(数字可改) |
spop zset | 随机删除集合中的某个元素 |
smove zset 2zset name | 移动zset集合中的name到2zset集合中 |
sdiff 2zset zset | 两个集合中的差集 |
sinter 2zset zset | 两个集合中的并集和去重 |
实战场景 :
- 标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人
- 点赞,或点踩,收藏等,可以放到set中实现
(4).Hash集合类型
- 是一个 String 类型的 field-value(键值对) 的映射表,特别适合用于存储对象
命令 | 详情 |
---|---|
hset zhash name zhangsan | 往集合中新增键值对 |
hget zhash name | 从集合中获取值 |
hmset zhash name zhangsan age 18 | 同时往集合中添加多个值 |
hgetall zhash | 获取集合中所有键值对 |
hdel zhash name | 从集合中删除指定的key |
hlen zhash | 获取集合的长度 |
hexists zhash name | 判断集合中是否存在 |
hkeys zhash | 获取集合中所有的值 |
hincrby zhash age 1 | 指定key增量 |
hsetnx zhash name zhangsan | 如果存在则失败,不存在则创建值 |
实战场景:
- 缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
(5).ZSet集合类型
- 有序集合和集合有着必然的联系,保留了集合不能有重复成员的特性
- 有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。
命令 | 详情 |
---|---|
zadd zzset 1 first | 添加一个值 |
zadd zzset 2 second 3 third 4 four | 添加多个值 |
zrangebyscore zzset -inf +inf | 集合中从小到大排序(-inf:负无穷, +inf:正无穷) |
zrangebyscore zzset -inf +inf withscores | 从小到大排序并输出键值 |
zrangebyscore zzset -inf 1 withscores | 指定负无穷到1的范围 |
zrem zzset four | 移除集合中指定的元素 |
zcard zzset | 查看集合中元素个数 |
zrevrange zzset 1 2 | 反转指定范围 |
实战场景:
- 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。