Redis常用操作及springboot整合redis

news2024/11/13 18:00:05

1. Redis和Mysql的区别

  • 数据模型:二者都是数据库,但是不同的是mysql是进行存储到磁盘当中,而Redis是进行存储到内存中.

  • 数据模型 : mysql的存储的形式是二维表而Redis是通过key-value键值对的形式进行存储数据.

  • 实际的应用的场景: Redis适合于需要快速读写的场景,如缓存、会话存储、计数器等,也适合于需要实时处理大量数据的应用,MySQL适合于需要进行复杂查询和事务处理的场景.

2. 连接Redis

  • 打开redis服务
  redis-server.exe redis.windows.conf,通过配置redis的配置文件进行启动redis服务
  • 启动redis客户端
redis-cli -h 地址 -p 端口号
// 例如 redis-cli -h localhost -p 6379
// redis-cli 默认进行连接本地的redis
  • 修改redis.windows.conf文件进行设置redis连接密码
requirepass 密码   // 通过修改requirepass 后面的fobared进行设置密码

3. Redisds常用数据类型

3.1 字符串

常用操作命令

-- =================字符串常用操作==========
-- 插入一条数据 set 键名 值
set name zhangshan
​
-- 获取指定键的值 结果: zhangshan
get name
​
-- 指定键值对的同时指定过期的时间 10s
-- 写法一
set name1 zhangshan ex 30
-- 写法二 set key time value
setex name2 10 zhangshan
​
-- 当某个key不存在的时间,进行设置值
setnx name3 zhangshan

字符串操作的时候,当默认对于key的值进行设置都是更新的操作.当使用setnx进行设置其值的时候,会进行判断这个key时候存在

3.2 哈希

Redis中hash是一个string类型的field和value的映射表.哈希适合进行存储对象类型的数据

key-value对应关系图: 这个类型图类似于是一个,对象进行存储数据的格式格式,key对应对象的名字,field对应属性,value为值.

hash常用操作

-- ==================hash类型相关操作============
-- 创建一个hash存储对象 对象名字为 student 其名字为张三
hset student name 张三
hset student age 18
​
-- 获取hash对象指定字段的值 结果: 张三
hget student name
​
-- 删除hash对象指定字段的值
hdel student age
​
-- 获取hash对象中所有的属性
hkeys student
​
-- 获取hash对象中指定字段的数量
hlen student
​
-- 获取hash对象表中所有字段和值
hgetall student

3.3 列表

Redisz中简单的字符串列表,按照插入的顺序进行排列。 key对应的列表的名字,value为这个列表。

-- ===============列表================
-- 插入 1 到 numList 中
lpush numList 1
-- 插入 2 3 到 numList 中
lpush numList 2 3
​
-- 获取 numList 的指定范围的值 0 -1 表示获取所有的值
-- lrange key start stop
lrange numList 0 -1
​
-- 删除列表中的最后一个元素
lpop numList
​
-- 查看列表中元素的个数
llen numList

3.4 集合

Redis中的集合Set是String类型的集合,并且其集合的成员是唯一的,无序的,不可重复。

-- ================集合================
-- 添加元素到 集合num 中
sadd num 1 2 3
​
-- 获取集合中的所有的成员 1 2 3
smembers num
​
-- 查询集合中的元素个数
scard num
​
-- 进行计算给定集合的交集
sadd num1 1 2 3 4 5
-- 结果 1 2 3
sinter num num1
​
-- 计算集合的并集 1 2 3 4 5
sunion num num1
​
-- 删除集合中的元素
srem num 1

3.5 有序集合

Redis中的有序集合也是String类型的集合,同样不允许有重复成员,不同的是每个元素都会关联double类型的分数.

数据结构类型示意图:
在这里插入图片描述
常用的操作命令

-- ============有序集合=====================
-- 添加元素到 有序集合num 中 zadd num sroce 字段名 [score 字段名]
zadd zset 1.0 a 2.0 b
​
-- 查询有序集合的成员 withscores 表示返回的元素包含分数
zrange zset 0 -1 withscores
​
-- 为某个元素增加分数 给a 增加 1.0分
zincrby zset 1 a
​
-- 删除有序集合中的元素 a
zrem zset a

4. Redis通用命令

-- ====================通用命令===============
-- keys pattern(匹配模式) keys * 表示获取所有的key
-- 进行获取num开头的key num*
keys num*
​
-- 判断某个key是否存在
exists name
​
-- 获取某个key的类型
type numList
​
-- 删除某个key
del name3

5. springboot整合Redis

5.1 引入依赖

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

5.2 在yml配置文件中进行配置Redis数据源

spring:
  redis:
    host: localhost # redis服务器地址
    port: 6379 # redis服务器端口
    password: 123456 # redis服务器密码
    database: 0 # redis数据库索引(默认为0)

5.3 编写Redis配置类

@Configuration
public class RedisConfig {
​
    /**
     * 配置redis模版
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){
        // 创建redis模版
        RedisTemplate redisTemplate = new RedisTemplate();
        // 设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(connectionFactory);
         // 设置key的序列化器是为了房子key乱码
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // 字符串序列化器
        // 设置value的序列化器 为了解决value乱码
        redisTemplate.setValueSerializer(new StringRedisSerializer());
         // 设置hash的value的序列化器 解决hash值乱码
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        // 设置hash的对象中的key的序列化器 解决hash的key乱码
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

上述配置类进行配置序列化器的目的是为了防止进行使用默认的序列化器,导致key和value乱码.

5.4 通过RedisTmplate对象操作Redis

// 测试类在test中的层级位置,必须要和main一致。
@SpringBootTest
public class SpringDateRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
​
    /**
     * 通过RedisTemplate操作redis中的字符串数据类型
     */
    @Test
    public void testString(){
        // set 插入数据
        redisTemplate.opsForValue().set("city","浙江");
        // get 获取数据
        String city = (String) redisTemplate.opsForValue().get("city");
        // 插入数据的同时设置有效期 TimeUnit.MINUTE为单位 分
        redisTemplate.opsForValue().set("city","杭州",3, TimeUnit.MINUTES);
        // 只能插入不存在的key 注意值只能输入字符串类型
        redisTemplate.opsForValue().setIfAbsent("num","1"); // true
        redisTemplate.opsForValue().setIfAbsent("num","2"); // false
    }
​
    /**
     * 操作redis中的Hash数据类型
     */
    @Test
    public void testHash(){
        // hset hget hdel hkeys hvals
        // 获取到hash数据类型操作器对象
        HashOperations hash = redisTemplate.opsForHash();
        // 对象名 属性名 属性值
        hash.put("user","name","张三");
        hash.put("user","age","18");
        // 获取user对象的指定属性的值
        String name = (String) hash.get("user","name");
        System.out.println(name); // 张三
​
        // 获取user对象的所有属性
        Object[] keys = hash.keys("user").toArray();
        Arrays.stream(keys).forEach(System.out::println);
​
        // 删除user对象的指定属性
        hash.delete("user","age");
​
    }
​
    /**
     * 列表类型
     */
    @Test
    public void testList(){
        // lpush rpush lpop
        ListOperations list = redisTemplate.opsForList();
        // 插入数据
        list.leftPushAll("list","1","2","3");
        // 获取数据
        List list1 = list.range("list", 0, -1);
        // 获取列表长度
        long size = list.size("list");
    }
​
    /**
     * 集合数据类型
     */
    @Test
    public void testSet(){
        // sadd smembers srem
        SetOperations set = redisTemplate.opsForSet();
        // 插入数据
        set.add("set","1","2","3");
        set.add("set1","1","4","5","6");
        // 获取集合中所有的元素
        set.members("set");
        // 请集合的交集
        Set intersect = set.intersect("set", "set1");
        // 求集合的并集
        Set union = set.union("set", "set1");
    }
​
    /**
     * 有序集合数据类型
     */
    @Test
    public void testZSet(){
        // zadd zrange zremrangeByRank
        ZSetOperations zSet = redisTemplate.opsForZSet();
        // 插入数据
        zSet.add("zset","1",1);
        zSet.add("zset","2",2);
        // 获取集合中所有的元素
        Set zset = zSet.range("zset", 0, -1);
        // 为集合中的某个元素加上指定的分数
        zSet.incrementScore("zset","2",1);
    }
}

学习日结

今天学习了redis的基本操作,通过今天的学习,对于redis的基本的环境的配置,和对于数据库的操作和使用已经可以掌握了,因为rdis这个数据类型,其实是和java中的数据类型是非常的相似的,并且对于其操作也是极其的相似,所以在理解和进行操作上是没有什么问题的。

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

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

相关文章

在Word中,用VBA比较两段文本的相似度

效果1: 去掉字符串中回车&#xff0c;进行改进后效果&#xff1a; 代码&#xff1a; Function LevenshteinDistance(s As String, t As String) As IntegerDim d() As IntegerDim i As IntegerDim j As IntegerDim cost As IntegerDim sLen As IntegerDim tLen As IntegersLen…

nginx实现https安全访问的详细配置过程

文章目录 前言什么是 HTTP&#xff1f;什么是 HTTPS&#xff1f;HTTP 和 HTTPS 的区别为什么 HTTPS 被称为安全的&#xff1f;配置过程配置自签名证书 前言 首先我们来简单了解一下什么是http和https以及他们的区别所在. 什么是 HTTP&#xff1f; HTTP&#xff0c;全称为“超…

IDEA 怎么编辑文件模板

1.打开设置2.打开编辑者&#xff0c;选择编辑文件模板 3.点击加号4.先随便编译一次5.之后编辑文件模板就有了

电脑浏览器访问华为路由器报错,无法访问路由器web界面:ERR_SSL_VERSION_OR_CIPHER_MISMATCH 最简单的解决办法!

This site can’t provide a secure connection192.168.2.1 uses an unsupported protocol. ERR_SSL_VERSION_OR_CIPHER_MISMATCH 以上是chrome浏览器访问报错 Secure Connection Failed An error occurred during a connection to 192.168.2.1. Peer using unsupported versio…

python 异步执行 apply_async 方法

1.项目需要读取hive表数据&#xff0c;并对返回的数据进行解析&#xff1b; select * from table ; 2.返回数据&#xff0c;根据库、表&#xff0c;对其进行 下一步执行&#xff1b; 中间遇到一个棘手的问题&#xff0c;在python线程池中&#xff0c;使用异步非阻塞 apply_a…

(k8s)kubernetes 挂载 minio csi 的方式(pod挂载pvc存在csi驱动问题,挂载不上)

一、安装Minio&#xff08;Minio分布式集群搭建部署_minio集群最少几台-CSDN博客&#xff09; 生成accessKeyID和secretAccessKey&#xff1a; 二、安装csi-s3插件(在k8s集群上) 首先我们把插件的yaml文件都下载下来&#xff0c;为了保证版本测试的一致性&#xff0c;我们下载…

如何在社交媒体上赚取(可观的)收入

有很多百万富翁是通过社交媒体粉丝建立起他们的财富的&#xff0c;而且其中大部分并不是Instagram网红或YouTube明星。 例如&#xff0c;Nick Huber通过社交媒体粉丝建立了几家企业&#xff0c;这些企业现在每月创造40万美元的收入。 而George Blackman在Twitter上仅有不到8,0…

微信自动回复设置真嘎嘎好用!

无论是商户、个人品牌还是普通用户&#xff0c;及时回应朋友和客户的信息至关重要。然而&#xff0c;手动一一回复既耗时又容易遗漏&#xff0c;这时&#xff0c;微信的自动回复功能就显得尤为重要。 今天&#xff0c;就教大家一招——通过个微管理系统&#xff0c;实现微信自…

怎么在线制作活码二维码?活码在电脑快速制作的方法

怎么制作活码类型的二维码&#xff1f;活码是现在很常用的一种内容展示&#xff0c;将内容通过二维码来展示&#xff0c;可以长期提供内容展示&#xff0c;而且在更新内容无需重新生码&#xff0c;可以直接在原码中修改。与其他方式相比有效提高内容传播的效率&#xff0c;在节…

【信号】SIGCHLD信号--了解

SIGCHLD是多少号信号呢&#xff1f;17号 我们知道用wait和waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作…

iptables实现内外网ip转换

准备三台虚拟机 内网访问外网 网络设置为仅主机&#xff08;关闭DHCP功能&#xff09; 设置一台双网卡机器充当iptables服务器 设置一台内网机 设置一台外网机&#xff0c;下载并开启httpd服务 在iptables服务器上设置iptables 在/etc/sysctl.conf中添加net.ipv4.ip_forwar…

零基础入门大模型,带你构建第一个大模型:实战指南

2017年是机器学习领域历史性的一年。Google Brain 团队的研究人员推出了 Transformer&#xff0c;它的性能迅速超越了大多数现有的深度学习方法。著名的注意力机制成为未来 Transformer 衍生模型的关键组成部分。Transformer 架构的惊人之处在于其巨大的灵活性&#xff1a;它可…

2024年上半年互联网黑灰产研究报告

2024年上半年&#xff0c;黑灰产从业人员人数超过427万&#xff0c;威胁猎人监测到国内作恶手机号数量高达323万&#xff0c;日活跃风险IP数量1136万&#xff0c;涉及洗钱银行卡数量19.5万。 近年来&#xff0c;数字化与实体经济的融合日渐深入&#xff0c;大规模业务线上场景…

Golang开发之路

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

做谷歌seo,b端跟c端有什么区别吗?

事实上大部分都没有区别&#xff0c;谷歌seo要做的事情其实都差不多&#xff0c;站内优化&#xff0c;站外推广&#xff0c;唯一不同的&#xff0c;就是在关键词的调研以及创建内容的时候不同&#xff0c;不过光是这一点不同&#xff0c;就能导致B端网站跟C端网站的决定性差异&…

HTML + js 生成一个线路走向图,可以标记总共有多少站,用户到达第几站了

文章目录 前言一、用途二、使用步骤1.轨迹代码2.运行前言 HTML + js 生成一个线路走向图 例如:用来记录用户到达那一站了,可以标记总共有多少站,用户到达第几站了 提示:以下是本篇文章正文内容,下面案例可供参考 一、用途 用来记录用户到达那一站了,可以标记总共有多少…

保姆级AI编程Cursor-Vscode使用教程

一: 下载&#xff0c;安装(输入语言后&#xff0c;然后迁移插件) 下载地址&#xff1a;https://www.cursor.com/settings 二: 登录 三. 玩AI--给一张UI图&#xff0c;一键生成需求代码&#xff08;需要自己去小改一下&#xff0c;大部分都可用&#xff09; 四、项目实践-优…

苹果手机管理软件哪个好用 苹果手机如何从安卓手机导入数据

随着科技的发展&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。苹果手机以其稳定的性能和卓越的用户体验受到广大用户的喜爱。然而&#xff0c;如何高效管理苹果手机以及如何从安卓手机导入数据&#xff0c;是许多用户在使用过程中常遇到的问题。本文将围绕“苹果手…

异步和多线程

概念 异步&#xff08;Asynchronous&#xff09;&#xff1a; 异步是一种编程模型&#xff0c;其核心思想是在等待I/O操作&#xff08;如文件读写、网络通信等&#xff09;完成时&#xff0c;不阻塞当前线程的执行&#xff0c;而是允许程序继续执行其他任务。当I/O操作完成后&…

Linux系统调用进程标识符

目录 一、冯诺依曼体系结构 二、操作系统 2.1什么是操作系统&#xff1f; 2.2为什么需要操作系统&#xff1f; 2.3怎么管理&#xff1f; 2.4总结 2.5系统调用 三、进程的理解 3.1进程的基本概念 3.2对进程的描述 3.3对进程的组织 3.4task_struct内容的分类 3.5Linux下…