Redis开发实战

news2024/9/23 3:30:05

 

  1. 单机部署安装
    1. 服务端下载,安装,启动
  2. 去官网下载最新的版本:http://redis.io/download ,这里用的是3.0.2
  3. 解压后,进入解压好的文件夹
  4. redis的安装非常简单,因为已经有现成的Makefile文件,所以直接先make,然后make install就可以了
  5. 安装的位置在/usr/local/bin ,有:
    1. redis-benchmark:性能测试工具,测试Redis在你的系统及配置下的读写性能
    2. redis-check-aof:用于修复出问题的AOF文件
    3. redis-check-dump:用于修复出问题的dump.rdb文件
    4. redis-cli:Redis命令行操作工具
    5. redis-sentinel:Redis集群的管理工具
    6. redis-server:Redis服务器启动程序
  6. 启动Redis的时候,只有一个参数,就是指定配置文件redis.conf的路径。redis.conf在解压的文件夹里面有,复制一个出来,按需修改即可,也可--port来指定端口
  7. 连接Redis并操作,使用redis-cli,如果有多个实例,可以redis-cli -h 服务器ip -p 端口
  8. 关闭Redis,redis-cli shutdown,如果有多个实例,可以指定端口来关闭:redis-cli -p 6379 shutdown
    1. 服务端修改Redis配置
      1. Redis基本配置

bind 127.0.0.1 #如果想要被远程访问注释掉bind配置或者bind外网ip即可

protected-mode yes # 是否开启保护模式 默认:yes,受bind和requirepass配置影响

port 6379# redis服务端口 默认:6379

tcp-keepalive 0 #对访问客户端的一种心跳检测默认:0(不检测),建议设置成60,单位秒

maxclients 10000 # 客户端最大连接数

loglevel notice # 日志级别配置 notice,debug,verbose,notice ,warning

logfile "" # 日志文件输出路径配置

databases 16 # 数据库数量配置 默认:16

requirepass 123456 # 连接密码配置 默认无密码

        1. 持久化配置
          1. RDB持久化配置

Redis的RDB(Remote Dictionary Base)持久化机制是通过将Redis数据库的某个时间点的状态以二进制格式保存到磁盘上的方式来实现持久化,当Redis服务器需要恢复数据时,可以通过加载RDB文件来恢复数据;相关配置如下:

# 持久化数据存储在本地的文件名称 默认:dump.rdb

dbfilename dump.rdb

# 持久化数据存储在本地的路径,默认:./(当前工作目录)

dir /data

save 300 10 # 表示每300秒内有至少10个写操作就保存一次RDB文件

# 当RDB持久化时出现错误无法继续时,是否阻塞客户端变更操作,错误可能因为磁盘已满/磁盘故障/OS级别异常等 默认:yes

stop-writes-on-bgsave-error yes 

# 是否启用RDB文件压缩,默认: yes,压缩往往意味着额外的cpu消耗,同时也意味这较小的文件尺寸以及较短的网络传输时间 

rdbcompression yes 

          1. AOF持久化配置

可以简单的认为 AOF 就是日志文件,优点可以保持更高的数据完整性,缺点AOF文件比RDB文件大,且恢复速度慢。

# 是否开启AOP 默认:no

appendonly yes 

# 指定AOF文件名称 

appendfilename appendonly.aof  

# 用于设置AOF文件的同步策略 默认:everysec

## 可以选择"always"、"everysec"或"no"。always表示每次写入都同步,everysec表示每秒同步一次,no表示由操作系统决定何时同步

appendfsync everysec 

# 用于设置自动AOF重写的阈值。当AOF文件的扩展比例超过该值时,Redis会自动执行重写操作。默认值为100,表示当AOF文件的大小是上一次重写后大小的一倍时触发重写。 

auto-aof-rewrite-percentage 100 

# 用于设置自动AOF重写的最小大小。只有在AOF文件的大小大于该值时,才会执行重写操作。默认值为64MB,建议512mb

auto-aof-rewrite-min-size 64mb 

# 用于设置在执行AOF文件重写时是否禁用同步。如果设置为yes,则在进行重写时不会进行同步操作,默认:no

no-appendfsync-on-rewrite no 

# 用于设置在加载AOF文件时是否允许Redis忽略出现错误的命令。如果设置为"yes",则忽略错误;如果设置为"no",则不允许加载出现错误的AOF文件。默认:yes

aof-load-truncated yes

# 用于设置AOF文件的开头是否包含RDB格式的部分。如果设置为"yes",则在AOF文件的开头会先保存一份RDB格式的数据,这有助于加速数据加载。默认:no

aof-use-rdb-preamble no

        1. Redis key过期监听配置

# key过期监听 默认:""(关闭),将notify-keyspace-events设置为Ex代表开启

notify-keyspace-events Ex

        1. Redis内存淘汰策略

# 将redis存储内存设置100mb的界限,当超过这个数值开始走淘汰策略

maxmemory 100mb

# 配置策略 默认:noeviction

maxmemory-policy allkeys-lru

内存淘汰算法

noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键

allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键

volatile-lru:加入键的时候如果过限,先从设置过期时间的键集合中驱逐最久没有使用的键

allkeys-random:加入键的时候如果过限,从所有key随机删除

volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐

volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键

volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键

allkeys-lfu:从所有键中驱逐使用频率最少的键

      1. 客户端查看工具安装

直接百度搜索“RedisDesktopManager”进行下载安装即可,该工具是Windows的客户端查看工具,具体效果如下:

    1. Redis主从复制
      1. 整体架构

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点

(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制的作用主要包括:

1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

4、高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:

1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;

2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。电商网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是"多读少写"。

对于这种场景,我们可以使如下这种架构

      1. 主从部署安装配置

    1. Java实操Reids中间件
      1. SpringBoot整合
        1. 第一步:导入依赖

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

        1. 第二步:Yaml配置Redis连接

        1. 第三步:配置Redis序列化方式

为什么要序列化呢?

举个例子,比如说我们经常会将POJO 对象存储到 Redis 中,一般情况下会使用 JSON 方式序列化成字符串,存储到 Redis 中

具体配置方法如下:

序列化方式常用的有如下几种:

JDK 序列化方式 (默认)

String 序列化方式J

SON 序列化方式

XML 序列化方式

绝大多数情况下,不推荐使用 JdkSerializationRedisSerializer 进行序列化。主要是不方便人工排查数据;其中StringRedisSerializer和FastJson2JsonRedisSerializer用的最多。

        1. 第四步:封装Redis工具类

在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。不过我们还需要进一步封装。

        1. 第五步:使用缓存

      1. RedisTemplate的API详解
        1. 获取操作Redis的对象

通过分析RedisTemplate源码发现,已经封装了所有Redis数据类型的操作。

我们只需要调用opsFor***()方法就可以获得相应的实例对象。

        1. 删除Key

        1. 指定缓存失效时间

        1. 根据key 获取过期时间

        1. 判断key是否存在

        1. String类型相关操作
  1. 获取缓存

  1. 添加缓存

  1. 添加缓存并设置过期时间

  1. 递增操作

  1. 递减操作

        1. Hash类型相关操作
  1. 设置一组Map的键值对

/**

     * HashGet

     * @param key 键 不能为null

     * @param item 项 不能为null

     * @return

     */

    public Object hget(String key,String item){

        return redisTemplate.opsForHash().get(key, item);

    }

  1. 获取指定Map的所有键值

    /**

     * 获取hashKey对应的所有键值

     * @param key

     * @return 对应的多个键值

     */

    public Map<Object,Object> hmget(String key){

        return redisTemplate.opsForHash().entries(key);

    }

  1. 添加一个Map类型值

/**

     * HashSet

     * @param key

     * @param map 对应多个键值

     * @return true 成功 false 失败

     */

    public boolean hmset(String key, Map<String,Object> map){

        try {

            redisTemplate.opsForHash().putAll(key, map);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

  1. 添加一个Map类型值并设置过期时间

      /**

     * HashSet 并设置时间

     * @param key

     * @param map 对应多个键值

     * @param time 时间(秒)

     * @return true成功 false失败

     */

    public boolean hmset(String key, Map<String,Object> map, long time){

        try {

            redisTemplate.opsForHash().putAll(key, map);

            if(time>0){

                expire(key, time);

            }

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

  1. 向一张hash表中放入数据,如果不存在将创建

/**

     * 向一张hash表中放入数据,如果不存在将创建

     * @param key

     * @param item

     * @param value

     * @return true 成功 false失败

     */

    public boolean hset(String key,String item,Object value) {

        try {

            redisTemplate.opsForHash().put(key, item, value);

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

  1. 向一张hash表中放入数据,如果不存在将创建并设置过期时间

    /**

     * 向一张hash表中放入数据,如果不存在将创建

     * @param key

     * @param item

     * @param value

     * @param time 时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间

     * @return true 成功 false失败

     */

    public boolean hset(String key,String item,Object value,long time) {

        try {

            redisTemplate.opsForHash().put(key, item, value);

            if(time>0){

                expire(key, time);

            }

            return true;

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }

    }

  1. 删除hash表中的值

   /**

     * 删除hash表中的值

     * @param key 键 不能为null

     * @param item 项 可以使多个 不能为null

     */

    public void hdel(String key, Object... item){

        redisTemplate.opsForHash().delete(key,item);

    }

  1. 判断hash表中是否有该项的值

/**

     * 判断hash表中是否有该项的值

     * @param key 键 不能为null

     * @param item 项 不能为null

     * @return true 存在 false不存在

     */

    public boolean hHasKey(String key, String item){

        return redisTemplate.opsForHash().hasKey(key, item);

}

  1. 递增,如果不存在,就会创建一个 并把新增后的值返回

/**

     * hash递增 如果不存在,就会创建一个 并把新增后的值返回

     * @param key

     * @param item

     * @param by 要增加几(大于0)

     * @return

     */

    public double hincr(String key, String item,double by){

        return redisTemplate.opsForHash().increment(key, item, by);

    }

  1. 递减

    /**

     * hash递减

     * @param key

     * @param item

     * @param by 要减少记(小于0)

     * @return

     */

    public double hdecr(String key, String item,double by){

        return redisTemplate.opsForHash().increment(key, item,-by);

    }

      1. Redis 实现文章的点赞、点赞排行榜

实现方案:采用Redis ZSet集合实现Redis点赞排行榜功能,因为ZSet集合是 有序且不重复的,元素具有唯一性,且有序,所以非常适合做点赞排行榜功能。

具体代码实现如下:

下面代码是点赞功能的实现:

查询点赞排行Top5的用户

如果您觉得这篇文章对你有帮助,请关注点赞,作者会更有动力!

持续更新中.........

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1696204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Photoshop插件(UXP)编写过程中,如何更新sp-checkbox的选中状态

✨问题说明 sp-checkbox是uxpSpectrum UXP Widgets下的一个小组件&#xff0c;内置样式大概是这样&#xff1a; 那么&#xff0c;如果用js动态的改变选中的状态&#xff0c;应该如何做呢&#xff1f; 如果直接是html来写&#xff1a; <sp-checkbox checked>Checked<…

freemarker ftl模板 格式、列表、图片

文章目录 前言一、freemarker实现内容替换二、ftl 模板1.word另存ftl2.编辑ftl文件2.1 了解一下常用的标记及其说明2.2 list处理2.3 红线2.4 图片 总结 前言 固定内容word生成&#xff1a;freemarker ftl模板 动态表格生成&#xff1a;https://blog.csdn.net/mr_wanter/articl…

基于MetaGPT构建LLM多智能体

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我们用了两万多字详细拆解了单个Agent的组成&#xff0c;并通过Github Trending订阅智能体理解MetaGPT框架的订阅模块如何解决应用问题&#xff0c;但是对于复杂&#xff0c;并行的任务&#xff0c;单…

Java进阶学习笔记20——枚举

认识枚举&#xff1a; 枚举是一种特殊的类。 枚举类的格式&#xff1a; 说明&#xff1a; 第一行是罗列枚举的对象名称。只能写合法的标识符&#xff08;名称&#xff09;&#xff0c;多个名称用逗号隔开。 这些名称本质上都是常量&#xff0c;每个变量都会记住枚举类的一个…

HIVE3.1.3+ZK+Kerberos+Ranger2.4.0高可用集群部署

目录 一、集群规划 二、介质下载 三、基础环境准备 1、解压文件 2、配置环境变量 四、配置zookeeper 1、创建主体 2、修改zoo.cfg 3、新增jaas.conf 4、新增java.env 5、重启ZK 6、验证ZK 五、配置元数据库 六、安装HIVE 1、创建Hiver的kerberso主体 2…

U盘引导盘制作Rufus v4.5.2180

软件介绍 Rufus小巧实用开源免费的U盘系统启动盘制作工具和格式化U盘的小工具&#xff0c;它可以快速将ISO镜像文件制作成可引导的USB启动安装盘&#xff0c;支持Windows或Linux启动&#xff0c;堪称写入镜像速度最快的U盘系统制作工具。 软件截图 更新日志 github.com/pbat…

Digital Image Processing System(DIPS)

数字图像处理系统 Digital Image Processing System&#xff08;DIPS&#xff09; 早前版本&#xff1a; ​​​​​​​DIPS_YTPC OCR-CSDN博客

(南京观海微电子)——TFT LCM的作用

VCOM介绍 VCOM是液晶分子偏转的参考电压 &#xff0c;要求要稳定&#xff0c;对液晶显示有直接影响&#xff0c;具体的屏不同的话 也是不同的。 电压的具体值是根据输入的数据以及Vcom电压大小来确定的&#xff0c;用来显示各种不同灰阶&#xff0c;也就是实现彩色显示GAMMA简…

【知识蒸馏】deeplabv3 logit-based 知识蒸馏实战,对剪枝的模型进行蒸馏训练

本文将对【模型剪枝】基于DepGraph(依赖图)完成复杂模型的一键剪枝 文章中剪枝的模型进行蒸馏训练 一、逻辑蒸馏步骤 加载教师模型定义蒸馏loss计算蒸馏loss正常训练 二、代码 1、加载教师模型 教师模型使用未进行剪枝&#xff0c;并且已经训练好的原始模型。 teacher_mod…

Strategy设计模式

Strategy设计模式举例。 看图&#xff1a; 代码实现&#xff1a; #include <iostream>using namespace std;class FlyBehavior { public:virtual void fly() 0; };class QuackBehavior { public:virtual void quack() 0; };class FlyWithWings :public FlyBehavior …

新人攻略:避开这3大坑,让老员工主动带你飞!

进入职场的新人们&#xff0c;常常会感到困惑和挑战。他们可能会发现自己在与老员工的交流中遇到难题&#xff0c;甚至发现老员工并不愿意花费时间和精力去指导他们。这背后的原因是什么呢&#xff1f;又该如何改善这一现象呢&#xff1f;本文将从新员工的角度出发&#xff0c;…

无人机飞手:ASFC无人机和航模爱好者证书详解

ASFC无人机和航模爱好者证书是由中国航空运动协会&#xff08;ASFC&#xff09;颁发的一种无人机操作资格认证。这种证书在无人机和航模爱好者群体中享有广泛的认可度&#xff0c;并被视为操作无人机的一种重要资质。 ASFC证书的定义和用途十分明确。它是民航局颁发的民用无人驾…

C++中的继承详解

1.继承的概念及定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的…

产品数据特性驱动设计

一、什么是数据特性 一个产品在宏观的视角下,是不同功能模块的有机组合;在微观的视角上,是千丝万缕的数据连接。 基于模块化设计思想,对产品进行业务化梳理,对业务进行模块化拆分出功能模块,功能模块就是产品的“逻辑”,而功能中的数据就是“特性”。 业务:比较固定…

马尔可夫和比奈梅-切比雪夫不等式

目录 一、说明 二、自然界的极限性 三、马尔可夫不等式 3.1 最早提出 3.2 马尔可夫不等式的证明 四、 Bienaym–Chebyshev 不等式 4.1 简要回顾Bienaym–Chebyshev 不等式的历史 4.2 Bienaym — Chebyshev 不等式的证明 五、弱大数定律&#xff08;及其证明&#xff09;…

C语言——⾼位优先与低位优先的不同之处是什么?

一、问题 C语⾔的最⼤特⾊就是可移植性好。根据机器类型的不同&#xff0c;⾼位优先与低位优先也不同。那么&#xff0c;最好的可移植的 C 程序应该同时适⽤这两种类型的计算机。下⾯了解⼀下⾼位优先与低位优先的不同之处。 二、解答 所谓的⾼位优先&#xff0c;就是最低的地…

实现排行榜之Mysql的 OrderBy方法

排行榜之Mysql OrderBy实现 1、排行榜系统的功能点 数据收集与计算 排名规则 实时性 可视化展示 周期性更新 2、排行榜系统基本功能要素 MySQL实现方案 数据量较小&#xff0c;业务场景比较简单。可直接使用 新建表 CREATE TABLE leaderboard( id BIGINT UNSIGNED NOT …

21.Happens-Before原则

文章目录 Happens-Before原则1.Happens-Before规则介绍2.规格介绍2.1.顺序性规则(as-if-serial)2.2.volatile规则2.3.传递性规则2.4.监视锁规则2.5.start规则2.6.join()规则 Happens-Before原则 JVM内存屏障指令对Java开发工程师是透明的&#xff0c;是JMM对JVM实现的一种规范和…

基于51单片机温度报警系统—数码管显示

基于51单片机温度报警系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.DS18B20采集温度&#xff0c;数码管显示温度&#xff1b; 2.温度测量范围&#xff1a;0-99度&#xff1b; 3.当温度低于…

Qt for android 获取USB设备列表(二)JNI方式 获取

简介 基于上篇 [Qt for android 获取USB设备列表&#xff08;一&#xff09;Java方式 获取]&#xff0c; 这篇就纯粹多了&#xff0c; 直接将上篇代码转换成JNI方式即可。即所有的设备连接与上篇一致。 (https://listentome.blog.csdn.net/article/details/139205850) 关键代码…