Redis学习笔记(上)
文章目录
导读
本篇内容适合初学redis的人群使用,本篇内容不讲比较深入的东西只普及基础的概念;后续会逐步深入。
1. Redis安装和使用
- Redis和可视化界面的安装,点击引用的地址就能找到了
Redis安装地址教程
Redis可视化界面安装教程
-> 可视化操作界面安装下载(可装可不装,主要是方便看值):常用的一般是RedisStudio或者是Redis Desktop Manager(推荐这个Manager非常好用就是安装包比较难找,大部分都需要收费)
- Redis使用打开安装目录–》先运行redis-sercer.exe启动服务,再运行redis-cli.exe指令窗口–》打开可视化界面RedisStudio\n
效果图如下:
redis-cli.exe用来使用操作指令的,操作命令这个后面会讲,有需要可以点击目录快速定位。这里的可视化是用Reids Studio;
在这里插入图片描述
这里每个db都是一个库,库里面能看到你设置的值
在Redis-cli.exe输入命令,可视化会显示值,显示不出来重新开可视化界面就好了
2. 什么是Redis
-
什么是Redis
Redis全称(Remote Dictionary Server),远程字典服务,是一个开源且用C语言编写,支持网络,可基于内存可持久化的日志型,Key-Value数据库,并且提供多种语言的API。 -
Redis的特点
- 有于是基于C语言编写,可以完全基于内存,绝大部分请求是净内存操作,非常的快速
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程(一个进程内有多个线程)切换的CPU消耗
- 非阻塞的IO多路复用机制
3. Redis数据类型
类型 | 说明 |
---|---|
String 字符串 | 使用Redis字符串的命令管理字符串 |
hash 哈希 | Redis hash是一个String类型的field和value的映射表,hash一般都是用来存对象的,Redis每个hash可以存232-1键值对约40多亿 |
List 列表 | Redis列表是简单的字符串列表,可以插入排序。 |
Set 集合 | Redis的Set是String类型的无序集合,集合内的元素唯一,一般用于去重 |
sorted Set 有序集合 | Redis 有序集合和集合一样也是String类型元素的集合,集合元素唯一 |
4. 常用的命令
这里我只列举比较常用的命令,其它一些不常用的如果需要使用到可以自行百度或者到下面这个老哥哪里查看;直接点击我引用的地址就能进去了
1. String
使用场景:几乎所有场景都能使用
命令 | 描述 | 语法 |
---|---|---|
set | 赋值 | set key value |
get | 取值 | get key value |
incr | 自增+1 | incr key |
strlen | 返回key的值和长度 | strlen key |
setrange | 字符串替换 | setrange key start value |
getrange | 获取指定字符串 | getrange key start end |
mset | 同时设置多个key value | mset key value [key1 value1…] |
mget | 同时获取多个key value | mget key [key1…] |
2. Hash
使用场景:用来缓存一些对象,商品信息,用户信息等等
命令 | 描述 | 语法 |
---|---|---|
hset | 给key中的field字段赋值 | hset key field value |
hget | 获取以中filed | hget key field |
hexists | 判断key中是否存在field | hexists key field |
hlen | 获取key中的field的数量 | hlen key |
hdel | 删除key字段中的field | hdel key field [field1,] |
3. List
使用场景:收藏列表,商品评论,队列
命令 | 描述 | 语法 |
---|---|---|
lpush | 在list头部添加值 | lpush key value [value1…] |
rpush | list在尾部添加值 | rpush key value [value1…] |
lrange | 获取指定位置的数据 | lrange key start end |
lpop | 从头部弹出key的值(删除) | lrange key start end |
rpop | 从尾部弹出key的值(删除) | rpop key |
rpoplpush | 从一个list的尾部弹出插入到另外一个list的头部 | rpoplpush source destnation |
4. Set
使用场景:用来做公众号,微博之类 的可以让别人关注自己的;
具体实现思路,讲a用户关注的人放在一个set中,粉丝根据六度分割理论放在一个集合里
命令 | 描述 | 语法 |
---|---|---|
sadd | 添加值 | sadd key member [menber1] |
smembers | 遍历集合 | smembers key |
scard | 获取key 的成员数目 | scard key |
srem | 删除指定成员 | srem key member [member1…] |
sismenber | 判断成员是否存在 | sismember key member |
spop | 随机弹出一个值(删除) | spop key |
5. ZSet
使用场景:存储班级成绩表,工资排序
命令 | 描述 | 语法 |
---|---|---|
zscore | 获取指定成员的分数 | zscore key member |
6. 其它常用命令
命令 | 描述 | 例子 |
---|---|---|
echo | 在命令行打印内容 | echo context |
keys | 获取所有key | keys pattern |
exists | 判断key是否存在 | exists key |
rename | 给key重新命名 | rename key newkey |
renamenx | 给key重新命名,当newkey存在是不操作 | rename key newkey |
expire | 设置key的存活时间 | expire key sexonds |
expireat | 设置key的存活时间(年月日) | expireat key timestamp |
type | 返回key中的vakue的类型 | type key |
5. Redis事务
Redis事务的特征:
- 单独的隔离操作:事务中的送一命令都会序列化,按顺序执行。事务在执行过程中不会呗客户端送来的命令打断锁
- 没有隔离级别的概念:队列中的命令没有提交之前都不会有实际的操作
- 不保证原子性:redis同一个事务中如果有一条执行失败,其它命令不会回滚,成功的继续执行,失败的显示失败
- redis的事务不会回滚,如果要回滚需要判断后手动回滚;(重点掌握这个)
事务的常用命令:
命令 | 作用 |
---|---|
multi | 开启事务 |
discard | 取消事务,取消所有事务命令 |
watch key [key1…] | 监视一个或者多个key,如果在事务执行之前这个key呗其它命令所改动那么事务将被打断(可以粗略的理解为线程的同步锁) |
unwatch | 取消命令对所以key的监视 |
下面例举几个案例来说明
- 首先是正常执行事务时,通过multi开启事务,完成自己想要的操作后用exec执行,并返回运行结果。
- 这里multi开启事务后,输入一些正确的代码,乱输入一些错误的代码,然后执行,发现这里提示。
语法异常或参数异常
- 这里设置一个字符d让它自增,肯定是不行的,发现成功的继续执行失败提示错误
- 事务不会回滚
- watch用法\n\n设置age为20,打开另一redis-cli 修改 age值为19
返回继续执行事务操作,发现事务执行失败;(防止非自己以外的修改)
6. API讲解
- Jedis\n这个是Redis实现的客户端,里面有全面的redis命令支持,springboot2.0之前一般都用这个(这个一般不用了,可以忽略)
- Redisson\n实现了分布式和可拓展的java数据结构异步;不需要即时完成任务的异步执行;比如手机发短信。
- Lettuce\n,比较常用;springboot2.0后才取代Jedis’的一个高级客户端,主要是用于线程安全同步,异步和响应使用,支持集群这点很重要,Sentinel,管道和编码器;
7. 持久化
- AOF方式:以日志的形式来记录每个写的操作,将redis执过的所有写的指令记录下来,并加锁(只允许追加,不允许修改文件)。
- 当redis启动时会读取该文件重新构建数据,根据日志文件的内容从最开始写入文件的指令一次执行完成数据的恢复。
- 缺点:就是随着时间的积累aof的文件会越来越大,这样会导致系统的响应时间变长,影响性能。
- RDB方式:在指定的事件间隔将内存中的数据集快照Snapshot写入磁盘,redis会单独创一个进程(一个进程里有多个线程)进行持久化,将数据写入临时文件夹中,
- 当持久化结束后,将这个文件替换上次的持久化的文件。重点是整个过程主进程都不进行任何的I/O操作,这样的话性能更高
- 缺点就是最后一次持久化的数据可能丢失,数据量大时,资源紧张时,系统会变慢。
8. 过期键的删除策略
- 定时删除:是指在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来执行对键的删除。
- 定期删除:redis默认没100ms(毫秒)随机抽取一些过期时间的key(幸运观众),如果过期就删除。
- 惰性删除:只在获取key的时候,先查下是否过期,过期删除,这样子每次获取key的时候都要查一下,会损耗一些内存,建议不使用
9. 内存淘汰机制
- allkeys-lru:在键空间中,移除最少使用的key(使用较多)
- noevivtion:在键空间中,写入操作会报错
- allkehys-random :在键空间中,随机移除某个key
- volatile-lru :在设置了过期时间的键空间中,移除最近最少使用的key
- volatile-random 在设置了过期时间的键空间中,随机移除某个key
- volatile-ttl 在设置了过期时间的键空间中,有更早过期时间的key优先移除