redis的部署及基本使用

一、redis部署

1、关闭防火墙

关闭防火墙:
systemctl stop firewalld.service
状态:
firewall-cmd --state
卸载防火墙
yum remove firewalld

2、CentOS7部署redis

1、检查编译运行环境,是否有 GCC 编译器

检查环境(gcc):
gcc --version安装gcc:
yum install gcc

2、安装redis

创建文件夹:
mkdir -p /opt/software/redis
cd /opt/software/redis
下载redis:
wget https://download.redis.io/redis-stable.tar.gz
解压:
tar -zxf redis-stable.tar.gz
安装:
cd redis-stable
make install

3、启动服务(静默启动)

修改redis.conf配置文件:
vim redis.conf
//修改可以登录的ip及端口
bind * -::*
bind 0.0.0.0 (外网)
//允许后台启动
daemonize yes
//配置日志文件
logfile /opt/software/redis/redis-stable/redis.log
//指定工作目录
dir /opt/software/redis
//设置密码
requirepass Zxc61415
//保护模式(打开只允许本地连接)
protected-mode yes
//持久话
appendonly yes//启动
redis-server redis.conf
//关闭
redis-cli -a Zxc61415 shutdown

3、docker部署redis

1、拉取镜像

docker pull redis:7.0.10

2、在宿主机的 /var/lib/docker/volumes/redis-config/_data/目录下创建一个redis的配置文件

如果/var/lib/docker/volumes没有redis-config,创建数据卷 
docker volume create redis-configvim redis.conf
# 内容如下所示
#开启持久化
appendonly yes
port 6379
# requirepass 1234
bind 0.0.0.0

3、创建容器

docker run -d -p 6379:6379 --restart=always \
-v redis-config:/etc/redis/config \
-v redis-data:/data \
--name redis redis:7.0.10 \
redis-server /etc/redis/config/redis.conf

二、redis的基本数据类型、操作和使用场景

1、redis基本操作
 

set 设置set name zxc
查看所有的keykeys *
get 获取get name
叠加/减计

incr num
decr num

incrby num 5
decrby num 5

setnx 设置不存在setnx lock1 1
del 删除del lock1
清空所有数据flushdb

2、string类型

使用场景:

  1. 存储Session
  2. 实现验证码
  3. 实现计数器
  4. 实现锁

Java代码:

@SpringBootTest
public class RedisTemplateTestJsonTest {@Autowiredprivate RedisTemplate redisTemplate;//缓存@Testpublic void test(){redisTemplate.opsForValue().set("k1","999",30, TimeUnit.SECONDS);Object object = redisTemplate.opsForValue().get("k1");System.out.println("object = " + object);}//计数@Testpublic void test01(){redisTemplate.opsForValue().set("num",1);Object object = redisTemplate.opsForValue().get("num");Long num = redisTemplate.opsForValue().increment("num"); //+1System.out.println("num = " + num);Long num1 = redisTemplate.opsForValue().decrement("num"); //-1System.out.println("num1 = " + num1);}//setnx锁@Testpublic void lockTest(){redisTemplate.opsForValue().setIfAbsent("lock1",1);Boolean lock1 = redisTemplate.opsForValue().setIfAbsent("lock1", 1,30,TimeUnit.SECONDS);System.out.println("lock1 = " + lock1);}
}

2、list类型

使用场景:

  1. 排序
  2. 最新
  3. 自定义栈
  4. 自定义队列

基本操作:

list基本操作
头插lpush message 1 2 3
获取(范围 -1表示所有)lrange message 0 -1
头取(取出数据并删除)lpop message
尾插rpush queue 1 2 3
尾取(取出数据并删除)rpop queue
获取数组长度llen queue
获取下标元素(从0开始,不会删除) lindex queue 2

Java代码:

@SpringBootTest
public class OpsForListTest {@Autowiredprivate RedisTemplate redisTemplate;//数组@Testpublic void listtest(){redisTemplate.opsForList().leftPush("list",1);redisTemplate.opsForList().leftPush("list",2);redisTemplate.opsForList().leftPush("list",3);List list = redisTemplate.opsForList().range("list", 0, -1);System.out.println(redisTemplate.opsForList().size("list"));list.forEach(num -> System.out.println("num = " + num));}//栈@Testpublic void stacktest(){redisTemplate.opsForList().leftPush("stack",1);redisTemplate.opsForList().leftPush("stack",2);redisTemplate.opsForList().leftPush("stack",3);List list = new ArrayList<>();list.add(redisTemplate.opsForList().leftPop("stack"));list.add(redisTemplate.opsForList().leftPop("stack"));list.add(redisTemplate.opsForList().leftPop("stack"));list.forEach(num -> System.out.print(num + " , "));}//队列@Testpublic void queuetest(){redisTemplate.opsForList().leftPush("queue",1);redisTemplate.opsForList().leftPush("queue",2);redisTemplate.opsForList().leftPush("queue",3);List list = new ArrayList<>();list.add(redisTemplate.opsForList().rightPop("queue"));list.add(redisTemplate.opsForList().rightPop("queue"));list.add(redisTemplate.opsForList().rightPop("queue"));list.forEach(num -> System.out.print(num + " , "));}}

3、hash类型

使用场景:

  1. 存储对象
  2. 购物车

基本操作:

设置hset user:001 name zxc age 20
设置多个值hmset user:002 name qh age 23
获取所有属性hgetall user:001
获取单个值hget user:001 name
修改单个值hset user:001 name zxx
获取长度hlen cart:001
删除hdel cart:001 1
数据加/减hincrby cart:001 10086 10 hincrby cart:001 10086 -5

Java代码:

@SpringBootTest
public class OpsForHash {@Autowiredprivate RedisTemplate redisTemplate;//存储对象@Testpublic void test(){redisTemplate.opsForHash().put("user:01","name","zxc");redisTemplate.opsForHash().put("user:01","age",12);System.out.println(redisTemplate.opsForHash().get("user:01", "name"));System.out.println(redisTemplate.opsForHash().get("user:01", "age"));Map map = new HashMap<>();map.put("name","qh");map.put("age",23);redisTemplate.opsForHash().putAll("user:02",map);System.out.println(redisTemplate.opsForHash().get("user:02", "name"));System.out.println(redisTemplate.opsForHash().get("user:02", "age"));}//购物车@Testpublic void carttest(){redisTemplate.opsForHash().put("cart:01","goods:01",4);redisTemplate.opsForHash().put("cart:01","goods:02",5);System.out.println(redisTemplate.opsForHash().size("cart:01"));redisTemplate.opsForHash().increment("cart:01","goods:01",5);redisTemplate.opsForHash().increment("cart:01","goods:01",-2);Map entries = redisTemplate.opsForHash().entries("cart:01");Set set = entries.entrySet();entries.keySet().forEach(key-> System.out.println(key));set.forEach(entry-> System.out.println(entry));}
}

4、set类型

使用场景:

  1. 随机(抽奖)
  2. 点赞

基本操作:

添加sadd luck1 1 2 3
查看smembers luck1
随机取出一个(并删除)spop luck1
删除一个值srem luck1 1
统计数量scard luck1
查找是否存在sismember luck1 1

Java代码:

@SpringBootTest
public class OpsForSet {@Resourceprivate RedisTemplate redisTemplate;@Testpublic void test(){redisTemplate.opsForSet().add("luck",1);redisTemplate.opsForSet().add("luck",2);redisTemplate.opsForSet().add("luck",3);System.out.println(redisTemplate.opsForSet().members("luck"));System.out.println(redisTemplate.opsForSet().size("luck"));}//抽奖@Testpublic void randomTest(){redisTemplate.opsForSet().add("person","qh","zxc","hz");System.out.println(redisTemplate.opsForSet().randomMember("person"));//或者(删除)System.out.println(redisTemplate.opsForSet().pop("person"));System.out.println(redisTemplate.opsForSet().members("person"));}//点赞@Testpublic void add(){redisTemplate.opsForSet().add("like","qh","zxc","hz");System.out.println(redisTemplate.opsForSet().members("like"));redisTemplate.opsForSet().add("like","yx");System.out.println(redisTemplate.opsForSet().members("like"));redisTemplate.opsForSet().remove("like","yx");System.out.println(redisTemplate.opsForSet().members("like"));}
}

5、zset类型

使用场景:

  1. 排行榜(排序)

基本操作:

添加

zadd sort 1 qh

zadd sort 2 zxc

查看(范围-分数)zrevrange sort 0 -1 withscores
添加zincrby sort 2 zxc
合并set(同key分数累加)zunionstore newset 2 sort sort1

Java代码:

@SpringBootTest
public class OpsForZSet {@Resourceprivate RedisTemplate redisTemplate;//排行榜@Testpublic void sort(){redisTemplate.opsForZSet().add("sort1","zxc",1);redisTemplate.opsForZSet().add("sort1","qh",2);redisTemplate.opsForZSet().add("sort1","hz",3);System.out.println(redisTemplate.opsForZSet().reverseRange("sort1", 0, -1));redisTemplate.opsForZSet().incrementScore("sort1","qh",2);System.out.println(redisTemplate.opsForZSet().reverseRangeWithScores("sort1", 0, -1));redisTemplate.opsForZSet().add("sort2","zxc",5);redisTemplate.opsForZSet().add("sort2","qh",2);redisTemplate.opsForZSet().add("sort2","hz",3);System.out.println(redisTemplate.opsForZSet().reverseRangeWithScores("sort2", 0, -1));redisTemplate.opsForZSet().unionAndStore("sort1","sort2","sort");System.out.println(redisTemplate.opsForZSet().reverseRangeWithScores("sort", 0, -1));}//合并多个@Testpublic void sort2(){redisTemplate.opsForZSet().add("sort1","zxc",1);redisTemplate.opsForZSet().add("sort1","qh",2);redisTemplate.opsForZSet().add("sort1","hz",3);System.out.println(redisTemplate.opsForZSet().reverseRangeWithScores("sort1", 0, -1));redisTemplate.opsForZSet().add("sort2","zxc",5);redisTemplate.opsForZSet().add("sort2","qh",3);redisTemplate.opsForZSet().add("sort2","hz",1);System.out.println(redisTemplate.opsForZSet().reverseRangeWithScores("sort2", 0, -1));redisTemplate.opsForZSet().add("sort3","zxc",2);redisTemplate.opsForZSet().add("sort3","qh",2);redisTemplate.opsForZSet().add("sort3","hz",2);System.out.println(redisTemplate.opsForZSet().reverseRangeWithScores("sort3", 0, -1));List<String> list = new ArrayList<>();list.add("sort2");list.add("sort3");redisTemplate.opsForZSet().unionAndStore("sort1",list,"sort");System.out.println(redisTemplate.opsForZSet().reverseRangeWithScores("sort", 0, -1));}
}

三、持久化

1、RDB

        RDB进行持久化是将当前进程的数据生成快照保存到硬盘中的过程

        优点是:占用的空间少、恢复快;

        缺点是:由于数据是定时保存,所以在下次保存前服务关闭会导致数据丢失。

2、AOF

        AOF是Append Only File,是Redis中实现持久化的一种方式。以独⽴⽇志的⽅式记录每次命令,重启时再重新执⾏ AOF ⽂件中的命令达到恢复数据的⽬的。AOF 的主要作⽤是解决了数据持久化的实时性,⽬前已经是 Redis 持久化的主流⽅式。

        开启AOF需要在 redis.conf 配置文件中将 appendonly 设置为 yes

       优点是:不会造成数据丢失,或者只会丢失很少的数据;

       缺点是:文件较大,由于恢复是重新构建数据,所以恢复的速度较慢。

四、redis的发布订阅模式

1、监听(一个消息会被多个监听)

subscribe name

2、发送

publish name message

五、springboot整合redis

1、导入依赖

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

2、配置

spring:data:redis:host: localhostpassword: 123456port: 6379timeout: 60sdatabase: 0

3、序列化

public class DefaultSerializer implements RedisSerializer<Object> {private final Charset charset;public DefaultSerializer() {this(Charset.forName("UTF8"));}public DefaultSerializer(Charset charset) {Assert.notNull(charset, "Charset must not be null!");this.charset = charset;}@Overridepublic byte[] serialize(Object o) throws SerializationException {return o == null ? null : String.valueOf(o).getBytes(charset);}@Overridepublic Object deserialize(byte[] bytes) throws SerializationException {return bytes == null ? null : new String(bytes, charset);}
}
@Configuration
public class AutoConfig {@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, String> redis = new RedisTemplate<>();redis.setConnectionFactory(redisConnectionFactory);// 设置redis的String/Value的默认序列化方式DefaultSerializer stringRedisSerializer = new DefaultSerializer();redis.setKeySerializer(stringRedisSerializer);redis.setValueSerializer(stringRedisSerializer);redis.setHashKeySerializer(stringRedisSerializer);redis.setHashValueSerializer(stringRedisSerializer);redis.afterPropertiesSet();return redis;}
}

4、使用

@SpringBootTest
public class RedisTemplateTestJsonTest {@Autowiredprivate RedisTemplate<String,String> redisTemplate;@Testpublic void test(){redisTemplate.opsForValue().set("k1","999",30, TimeUnit.SECONDS);String s = redisTemplate.opsForValue().get("k1");System.out.println("s = " + s);}
}

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

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

相关文章

防御---001

一、实验拓扑二、要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00 - 18:00)可以访问&#xff0c;生产区的的设备全天可以访问. 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMZ…

Linux的tmp目录占用空间100%问题分析和解决

一、背景 系统运行期间&#xff0c;客户突然反馈上传文档传不上去。研发立马排查日志&#xff0c;发现日志中出现大量的“No space avaliable on disk”&#xff0c;下意识应用服务器磁盘满了&#xff0c;赶快连上服务器查看磁盘空间占用情况&#xff1a; 黑人问号脸&#xff…

前端程序员常用快捷键

一些常用的快捷键 我们在开发时为了提高代码编写效率&#xff0c;通常会使用一些快捷键。我们开发工具自带的快捷比较多&#xff0c;我这里不一一列举了&#xff0c;我把一些常用的快捷键拿出来给大家大致讲一讲&#xff0c;我这里以window电脑为例&#xff0c;如果你mac电脑&a…

利用Hbuilder创建vue3的web项目

大体流程如下 npm install vue-router4 下载完&#xff0c;就创建完了

【概率统计】如何通俗易懂的理解P值

通俗易懂的P值解析&#xff1a;用简单例子理解统计概念 什么是P值&#xff1f; P值是统计学中的一个概念&#xff0c;用来评估实验结果的罕见程度。它并不能直接告诉实验是否成功或假设是否正确&#xff0c;而是帮助判断在假设成立的情况下&#xff0c;观察到的结果有多罕见。…

模版初阶(更新)

文章目录 模版介绍函数模版模版匹配规则类模版结言 模版介绍 函数模版分为两个类型&#xff1a; 函数模版类模版 函数模版 语法格式&#xff1a; t e m p l a t e < t y p n a m e T 1 , t y p n a m e T 2... > template<typname T1,typname T2...> template&…

用这款免费爬虫神器,不用手动撸代码了!

很多人学习Python和我说是为了“爬虫”&#xff0c;爬虫的用处确实很丰富&#xff0c;如&#xff1a; 市场研究&#xff0c;了解竞争对手信息&#xff0c;爬虫收集舆论信息、产品动态。 价格分析&#xff0c;通过抓取不同平台商品价格&#xff0c;监测价格波动&#xff0c;…

刷题Day48|115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离

115.不同的子序列 115. 不同的子序列 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;dp[i][j]&#xff1a;以i-1为结尾的s子序列中出现以j-1为结尾的t的个数。dp[i][j]还是考虑两种情况&#xff1a; s[i - 1] t[j - 1]&#xff0c;dp[i][j] dp[i - 1][j - 1] …

MySQL:left join 后用 on 还是 where?

在MySQL中&#xff0c;LEFT JOIN用于返回左表&#xff08;即LEFT JOIN关键字左边的表&#xff09;的所有记录&#xff0c;即使在右表中没有匹配的记录。对于那些右表中没有匹配的记录&#xff0c;结果集中右表的部分会被填充为NULL。关于ON和WHERE子句的使用&#xff0c;它们在…

通过gateway 打印日志全局控制日志

需求&#xff1a; 业务上经常需要打印日志&#xff0c;传统代码加日志&#xff0c;对代码侵入太强&#xff0c;不管是添加删除修改日志 都会改动代码&#xff0c;即使使用注解也需要添加注解&#xff0c;想实现且偶零侵入添加代码。 解决方法 gateway 自定义filter。 前置条…

【Go系列】 Go语言的入门

为什么要学习Go 从今天起&#xff0c;我们将一同启程探索 Go 语言的奥秘。我会用简单明了的方式&#xff0c;逐一讲解 Go 语言的各个知识点&#xff0c;帮助你从基础做起&#xff0c;一步步深化理解。不论你之前是否有过 Go 语言的接触经验&#xff0c;这个系列文章都将助你收获…

题解[自己出的题]

题解 题目&#xff1a; 舞伴配对 思路&#xff1a; 首先我们初始化两个队列 男生队列为q1,女生为q2 然后我们入队 因为我们现在每一个队伍都是有编号的 那我们先处理q1(男生队)&#xff1a; M M M个人 我们要为每一个人进行入队 在第一个循环的第二行(见<)让队首入队&a…

比curl更直观的网站性能测试工具httpstat——筑梦之路

GitHub - davecheney/httpstat: Its like curl -v, with colours. wget https://raw.githubusercontent.com/reorx/httpstat/master/httpstat.pymv httpstat.py /usr/bin/httpstat #移动到环境变量路径chmod x /usr/bin/httpstat #添加可执行权限 exec bash #重置当前bash进…

请编写函数,删除字符串中指定位置下的字符,删除成功函数返回被删字符,否则返回空值

char arr_del(char* p, int pos) {if (pos> strlen(p) || pos<0){printf("这是一个无效下标\n");exit(1);}//到这里就是有效下标char ch p[pos];//把要删除的下标存储for (int i pos; p[i] ! \0; i){p[i] p[i 1];}return ch; } int main() {char arr[100];…

MySQL9.0的新特性

MySQL 9.0 版本出来了&#xff0c;我也学学它的一些新特性。 高级 JSON 数据处理&#xff1a;MySQL 9.0 增强了对 JSON 数据的处理能力&#xff0c;允许用户将 EXPLAIN ANALYZE 命令的 JSON 输出直接保存到用户变量中&#xff0c;这使得查询调试和优化更加容易。例如&#xff0…

使用conda安装openturns

目录 1. 有效方法2. 整体分析使用pip安装使用conda安装验证安装安装过程中可能遇到的问题 1. 有效方法 conda install -c conda-forge openturns2. 整体分析 OpenTURNS是一个用于概率和统计分析的软件库&#xff0c;主要用于不确定性量化。你可以通过以下步骤在Python环境中安…

芋道源码 yudao-cloud 文档,视频,开发指南如何看全部

进入官网后可以看到相关内容 但是后端手册开始就看不了了 必须加入知识知识星球才行&#xff0c;很烦 闲**鱼搜索用户 水城打坐的藤壶 找到这个链接 这下大家都懂了吧 现在就可以看到看不到的内容了 在线文档的弹窗可技术去除&#xff0c;很简单 直接起飞哈 包括更新sq…

数据结构与算法基础篇--二分查找

必要前提&#xff1a;有序数组 算法简述&#xff1a;通过不断取中间值和目标target值进行比较&#xff08;中间值&#xff1a;mid (left right) / 2&#xff09; 如果目标值等于中间位置的值&#xff0c;则找到目标&#xff0c;返回中间位置如果目标值小于中间位置的值&…

YOLOv10改进 | 图像去雾 | MB-TaylorFormer改善YOLOv10高分辨率和图像去雾检测(ICCV,全网独家首发)

一、本文介绍 本文给大家带来的改进机制是图像去雾MB-TaylorFormer&#xff0c;其发布于2023年的国际计算机视觉会议&#xff08;ICCV&#xff09;上&#xff0c;可以算是一遍比较权威的图像去雾网络&#xff0c; MB-TaylorFormer是一种为图像去雾设计的多分支高效Transformer…

vim编辑器的使用

vim编辑器&#xff1a; u:撤销操作 ctrlr取消u操作 w&#xff1a;向后按单词移动 b&#xff1a;向前按照单词移动 :%s/printf/cout/g 将printf替换为cout vs copy.c 分屏操作 ctrlww跨屏操作 &#xff01;gcc test.c :!./a.out在vim中对代码进行编译执行 Centos下配置…