女朋友都能学会的Redis入门教程


Redis简单使用


一、Redis是什么?

Redis 是一个开源 (BSD 许可)、内存数据结构存储,用作数据库、缓存和消息代理。Redis 提供数据结构,如字符串、哈希、列表、集、分拣集,包括范围查询、位图、超日志、地理空间索引和流。Redis 具有内置复制、Lua 脚本、LRU 驱逐、交易和不同级别的磁盘持久性,并通过 Redis 哨兵和与 Redis 集群的自动分区提供高可用性。

二、安装

1.Windows

官网上好像没有windows的安装包了,需要去github上下载github下载地址
在这里插入图片描述
下载完成后,直接解压即可。

2.Linux

Redis官方下载地址
在这里插入图片描述
(1)下载完成之后把文件上传到Linux服务器,然后执行命令tar -zxvf redis-6.2.3.tar.gz,等待解压。
(2)解压完成后,执行命令yum istall gcc-c++安装一些环境
(3)执行命令make
(4)执行命令make install

三、运行

1.Windows

打开cmd窗口,用cd命令切换到redis安装目录,执行命令redis-server.exe redis.windows.conf
在这里插入图片描述
另起一个cmd窗口执行命令redis-cli -h 127.0.0.1 -p 6379,输入ping返回pong就成功了。
在这里插入图片描述

2.Linux

执行命令redis-server redis.conf
同样使用redis-cli -h 127.0.0.1 -p 6379进行连接客户端,使用ping测试。

四、基本命令

1.select index选择数据库,index是下标,redis默认是16个数据库,下标则是0-1
2.get key根据key取值,返回value
3.keys *查看所有key,返回所有key
4.flushall清空全部库
5.flushdb清空当前库
6.dbsize查看当前库大小,返回key的个数
7.exists key查询key是否存在,存在返回1,不存在返回0
8.del key删除key,成功返回1,失败返回0
9.move key db移动key到指定库,db指库下标,成功返回1,失败0
10.expire key seconds设置key的过期时间,单位秒
11.ttl key查看key的过期时间,返回剩余时间
12.type key查看当前key的value类型,返回类型

五、五大基本数据类型

1.strings(字符串)

1.1介绍

这是最简单Redis类型。如果你只用这种类型,Redis就像一个可以持久化的memcached服务器

1.2常用命令

1.set key value键值对存值
2.append key value在当前key后面追加字符串,如果key不存在,则新建,返回字符串长度
3.incr key当前key的value原有基础上+1,value必须是数字,成功则返回计算结果
4.decr key-1操作
5.incrby key increment自定义加多少,当前key的value和increment必须是数字,成功则返回计算结果
6.decrby key increment减法
7.setex key seconds value设置key的值的同时设置过期时间,如果key已存在,则替换旧值
8.setnx key value判断key是否存在,不存在的时候在设置值
9.mset key value [key value ...]批量设置值
10.mget key [key ...]批量获取值
11.msetnx key value [key value ...]批量设置值的时候判断key是否存在,不存在则创建,若有一个key存在,则命令失败,保证了原子性
12.getset key value不存在key的时候,添加key和value,存在key的时候,更新value,返回的是旧的value

1.3INCR是原子性操作

假如有有个key的值为1,有两个客户端同时对这个key执行了incr操作,那么结果一定会是3。incrby、decr、decrby同理

2.lists(列表)

2.1介绍

Redis lists基于Linked Lists实现。所以添加的效率快,查询的效率慢。如果需要经常查询数据,建议使用有序集合(sorted sets)。

2.2常用命令

1.lpush key element向一个列表的头部添加新值,value可以批量,返回列表个数
在这里插入图片描述

2.rpush key element向一个列表的尾部添加新值,value可以批量,返回列表个数
3.lrange key start stop取出列表中一定范围的数据,start和stop是下标。需要注意的是(1)开始下标一定比结束下标小,否则会报错(2)开始下标、结束下标都可以为负数,为负数的意思是是尾部开始计算
(3)当开始下标为负数是,结束下标不能为0
从下标0开始到倒数第一个
在这里插入图片描述
4.lpop key count从头开始删除指定个数元素,count不填则删除一个,返回删除的元素,所有元素被弹出后,key也不存。blpop
在这里插入图片描述

5.rpop key count从头尾部删除指定个数元素,count不填则删除一个,返回删除的元素
在这里插入图片描述
6.lindex key index同过指定下标获取值
7.llen key获取列表长度
8.lrem key count element移除指定个数,指定元素,返回移除的个数
在这里插入图片描述
9.ltrim key start stop截取指定长度
10rpoplpush source destination弹出列表最后一个元素并添加到新的列表头部,返回弹出的元素
在这里插入图片描述
11.lset key index element向列表指定下标设置值
12.linsert key before|after pivot element在列表指定元素的前或后添加新的元素
在这里插入图片描述
13.del key删除列表

2.3阻塞操作

brpop、blpop、brpoplpush是rpop、lpop、rpoplpush的阻塞操作。list是空,就需要轮询来获取数据,这样就会增加redis的访问压力、增加消费端的cpu时间,而很多访问都是无用的。使用阻塞操作可以设置一个过期时间(单位秒),如果在时间内获取了数据就立刻返回,超时还没活动数据则返回null。
例:首先打开一个redis客户端执行命令brpop k1 20(k1不存在),可以看到在20.09s时超时,并返回null。
在这里插入图片描述
打开一个新的客户端,在第一个客户端继续执行brpop k1 20。这时在第二个客户端执行rpush k1 1 2 3,往k1里添加一些元素,这时执行弹出命令的客户端就可以成功弹出值了。
在这里插入图片描述

3.hashes(散列)

3.1介绍

对应Java中HashMap,由键值对组成。值得注意的是,小的 hash 被用特殊方式编码,非常节约内存。

3.2常用命令

1.hset key field value [field value ...]设置键值对,可批量设置,hmset key field value [field value ...]也可
2.hget key field获取指定散列的指定键的值,hmget key field [field ...]可以批量获取散列的键的值
3.hgetall key获取指定散列的所有键值
4.hdel key field [field ...]删除散列的指定键,可以批量操作
5.hlen key获取散列的长度
6.hexists key field判断散列的键是否存在
7.hkeys key获取散列所有键
8.hvals key获取散列所有值
9.hincrby key field increment在散列指定键进行加法操作

4.sets(集合)

4.1介绍

Set是String 的无序排列。值不可重复。

4.2常用命令

1.sadd key member [member ...]添加值,可批量
2.smembers key获取所有值
3.sismember key member判断集合中是否存在某个元素
4.scard key获取集合元素个数
5.srem key member [member ...]移除集合的元素,可批量
6.srandmember key [count]随机获取集合中指定个数的元素
7.spop key [count]随机删除集合中指定个数的元素
8.smove source destination member移动集合的指定元素到新的集合中
9.sdiff key [key ...]获取指定集合间的差集
10.sinter key [key ...]获取指定集合间的交集
11.sunion key [key ...]获取指定集合间的并集

5.sorted sets(有序集合)

5.1介绍

有序集合是类似于集和哈希混合的数据类型。与集合一样,有序集合由独特的、非重复的字符串元素组成,但是与集合不同的是元素是按照顺序排列的。

5.2常用命令

1.zadd key score member [source member ...]添加值,可批量。score可以理解为序号。
2.zrange key min max查询指定下标范围的元素,正序
3.zrevrange key start stop倒序
比如添加一些姓氏,注意的是我在添加sun的时候把它的序号设置为4,那么在查询的时候redis已经自动帮我们排了序
在这里插入图片描述
4.zrange key min max withscores加上withscores表示连同score一起查询出来,查询时倒序同理
在这里插入图片描述
5.zrangebyscore key min max [withscores] [limit offset count]根据score的范围查询数据,加上withscores可以同时查出score,也可以加上limit分页,跟mysql效果一样。
例:先添加了一些用户的分数,然后查询出分数在80和100之间的用户,并且只查询前两条
在这里插入图片描述
默认范围是闭区间的,也就是说可以等于80或100,如果想是开区间,在score参数前加上(即可
在这里插入图片描述
6.zrem key member [member ...]移除集合指定元素,可批量
7.zcard key获取集合元素个数
8.zcount key min max获取集合指定区间的元素个数,条件是score,也可以用(做闭区间

六、三种特殊数据类型

1.bitmaps(位图)

1.1介绍

位图不是实际数据类型,而是在字符串类型上定义的一组面向位的操作。其最大长度为 512 MB,所以它们适合设置为2^32个不同的位,其值不是0就是1。

1.2常用命令

1.setbit key offset value在指定位上设置值,value只能是0或1
2.getbit key offset获取指定位上的值
3.bitcount key start stop统计指定下标范围值为1的数量

2.hyperloglogs (基数统计)

2.1介绍

HyperLogLog 是一种概率数据结构。

2.2常用命令

2.2常用命令

1.pfadd key element [element ...]添加值,可批量
2.pfcount key统计数量
3.pfmerge destkey sourcekey [sourcekey ...]合并多个并放在新的key

3.geospatial(地理空间)

3.1介绍

经纬度的一些操作

3.2常用命令

1.geoadd key longitude latitude member [longitude latitude member ...]添加经纬度,可批量。需要注意的是有效的经度是-180度到180度,有效的纬度是-85.05112878度到85.05112878度,南北极不可添加。
2.geodist key member1 member2 [m|km|ft|mi]查询两点的距离,可指定单位,默认米
3.geopos key member [member ...]获取元素的经纬度信息,可批量
4.georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [count]获取指定经纬度指定半径内所有元素。witchcoord返回时带上经纬度,withdist返回时带上距离,count返回指定个数
5.geohash key member [member ...]返回元素hash值

七、SpringBoot集成

1.Jedis

JRedis 是一个高性能的 Java 客户端,用来连接到 Redis 分布式哈希键-值数据库。提供同步和异步的连接。

1.1创建springboot项目

省略

1.2引入maven依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

1.3使用

想使用Jedis,直接new一个即可,构造函数有很多个,最简单的如下,填入主机地址和端口号即可。
在这里插入图片描述
之后使用jedis里的方法就能操作redis了。方法名和命令基本一样。
在这里插入图片描述

1.4测试

Jedis jedis = new Jedis("127.0.0.1", 6379);
// 如果redis有密码,需要先验证
jedis.auth("123456");
// 放入一个值并输出
jedis.set("k1", "123456");
System.out.println(jedis.get("k1"));

登录redis客户端也是可以看到值
在这里插入图片描述

2.Spring Data Redis

2.1为什么要使用SpringDataRedis

在 springboot 1.5.x版本的默认的Redis客户端是 Jedis实现的,springboot 2.x版本中默认客户端是用 lettuce实现的。
Jedis在实现上是直接连接,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接
Lettuce的连接是基于Netty的,实例在多个线程中共享,不存在线程不安全的情况

2.2引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.3配置

在这里插入图片描述

2.4使用

依赖注入

@Resource
private RedisTemplate<Object, Object> redisTemplate;

可以看到redisTemplate专门针对没一种类型设置了一个类,然后再去调用里面的方法
在这里插入图片描述

redisTemplate.opsForValue().set("k1" , "测试");

登录客户端查看,发现值发生了乱码,因为RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,我们可以自己重写序列化方式。
在这里插入图片描述

八、序列化

@Configuration
public class RedisConfig {

    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // redis连接
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 序列化配置
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // String序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String序列化
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String序列化
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value的序列化使用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value使用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

九、Redis配置文件

配置文件简单解读
1.units are case insensitive so 1GB 1Gb 1gb are all this same
redis对单位的大小写不敏感
2.bind 127.0.0.1
bind表示绑定的ip,默认是127.0.0.1
3.protected-mode yes
保护模式,默认是yes,如果想让外网可以访问服务器的redis,需要把bind注释,protected-mode设置为no
4.port 6379
绑定的端口号,默认6379
5.debug (a lot of information, useful for development/testing)
verbose (many rarely useful info, but not a mess like the debug level)
notice (moderately verbose, what you want in production probably)
warning (only very important / critical messages are logged)
loglevel notice
日志级别
6.logfile “/www/server/redis/redis.log”
日志保存目录
7.databases 16
数据库个数,默认16
8.always-show-logo yes
是否总是显示logo
9.save 900 1 如果900秒内,至少操作了1个key,就持久化
save 300 10 如果300秒内,至少操作了10个key,就持久化
save 60 10000 如果60秒内,至少操作了10000个key,就持久化
rdb持久化策略,在下面持久化中详细说明
10.stop-writes-on-bgsave-error yes
持久化出错时,是否继续工作
11.rdbcompression yes
是否压缩rdb文件
12.rdbchecksum yes
保存rdb文件时,进行错误检查校检
13.dbfilename dump.rdb
rdb文件名
14.dir /www/server/redis/
rdb文件保存路径
15.replica-serve-stale-data yes
16.replica-read-only yes
17.repl-diskless-sync no
18.repl-diskless-sync-delay 5
19.repl-disable-tcp-nodelay no
20.replica-priority 100
21.requirepass 123456
redis密码,默认是空
22.appendonly no
aof持久化是否开启
23.appendfilename “appendonly.aof”
aof文件名称
24.appendfsync always 总是写入aof文件,并完成磁盘同步
appendfsync everysec 每一秒写入aof文件,并完成磁盘同步
appendfsync no 写入aof文件,不等待磁盘同步。
aof策略

十、持久化

1.rdb

1.1机制

RDB其实就是把数据以快照的形式保存在磁盘上。RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

1.2触发方式

手动触发

save命令会阻塞当前服务器,直到RDB完成为止,如果数据量大的话会造成长时间的阻塞。一般使用bgsave,执行bgsave命令时Redis主进程会fork一个子进程来完成RDB的过程,完成后自动结束。

自动触发

在配置文件里配置

save 900 1 如果900秒内,至少操作了1个key,就持久化
save 300 10 如果300秒内,至少操作了10个key,就持久化
save 60 10000 如果60秒内,至少操作了10000个key,就持久化

1.3优缺点

优点
1.适合大规模的数据恢复
2.对数据完整性不搞
缺点:
1.需要一定的时间间隔进程操作
2.fork进程的时候,会占用一定内存

2.aof

2.1机制

redis执行的每一条命令都会记录,通过write函数追加到文件中。简单理解就是日志。

2.2开启方式

默认是不开启的。通过更改配置文件。

## 此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能  
appendonly yes  

## 指定aof文件名称  
appendfilename appendonly.aof  

## 指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec  
appendfsync everysec  
## 在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”  
no-appendfsync-on-rewrite no  

## aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”  
auto-aof-rewrite-min-size 64mb  

## 相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比  
## 每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A)
## aof文件增长到A*(1 + p)之后,触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。  
auto-aof-rewrite-percentage 100

2.3触发方式

手动触发

bgrewriteaof命令,与bgsave有些类似:都是fork子进程进行具体的工作,且都只有在fork时阻塞。

自动触发

根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机

  • auto-aof-rewrite-min-size:执行AOF重写时,文件的最小体积,默认值为64MB。
  • auto-aof-rewrite-percentage:执行AOF重写时,当前AOF大小(即aof_current_size)和上一次重写时AOF大小(aof_base_size)的比值。

2.4优缺点

优点
1.每一次修改都会同步,文件完整性会更好
2.每秒都会同步,仅丢失一秒的数据
3.从不同步,效率最高
缺点
1.aof大于rdb,修复速度比rdb慢
2.运行效率比rdb慢

十一、事物

redis单条命令是保证原子性的,但是事物不保证原子性。

1.multi

开启事物

2.执行命令

正常执行Redis命令

3.exec

执行事物

4.discard

放弃事物

十二、消息订阅

1.订阅

subscribe channel [channel ...]订阅

2.推送

publish channel message推送消息
假如订阅qq这个频道
在这里插入图片描述
像qq频道发送消息
在这里插入图片描述
收到消息
在这里插入图片描述

十三、缓存穿透、击穿、雪崩

正常的请求应该是先去查询redis,redis中没查询到,再去查询mysql
在这里插入图片描述

1.穿透

1.1概念

大量的请求没有命中redis缓存,然后请求落在了mysql上,导致mysql崩溃

1.2举例

比如黑客用id=-1一直请求,正常情况id不可能为-1,所以没有命中redis,直接请求数据库,导致数据库压力过大

1.3解决方案

  • 对不存在的数据缓存一个null(注意的是要设置短期的过期时间,不然太多的null会触发删除机制,删除正常数据)
  • 校验参数
  • 布隆过滤器

2.击穿

2.1概念

大量请求在请求redis中同一个key,但是这key刚好过期,大量请求落在mysql上。

2.2举例

双十一抢购,假如认为一个热门商品抢购2小时,就不会有人买了,所以设置这个商品的缓存时间是2小时。结果2小时后商品太好还在抢购,那么在缓存消失的瞬间,请求落在mysql上,导致崩溃。

2.3解决方案

-不设置过期时间

3.雪崩

3.1概念

redis的中key在同一时刻全部失效,请求直接落在mysql上

3.2举例

双十一访问淘宝,需要把热门数据进行缓存,假设预计用户会在凌晨1点购买完毕,所以把缓存的失效时间设置到1点。结果用户太热情,1点还没买完,这时访问,redis没有缓存了,所有请求砸到mysql。

3.3解决方案

  • 失效时间设置长一点
  • 随机设置失效时间,不要在同一时间全部失效

4.布隆过滤器

4.1guava

使用guava工具类
1.导入maven依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>29.0-jre</version>
</dependency>

5.主从复制

6.哨兵模式


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值