• 瑞吉外卖Redis


    😹 作者: gh-xiaohe
    😻 gh-xiaohe的博客
    😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!

    💒 Redis

    Redis是一个基于内存的key-value结构数据库。

    • 基于内存存储,读写性能高
    • 适合存储热点数据(热点商品、资讯、新闻)
    • 企业应用广泛

    Redis 应用场景

    • 缓存
    • 任务队列
    • 消息队列
    • 分布式锁

    🚏 Reids基础

    Window 和 Linux

    🚀 Redis 简介

    🚬 Redis 下载与安装
    🚬 Redis 服务启动与停止

    详细内容阅读请移步到本链接

        redis.conf 配置密码requirepass参数设置密码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7gJrKut-1662343970178)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220903222432419.png)]

        redis.conf 配置 可以让其远程客户端链接bind 127.0.0.1(指定客户端只能由这个地址来链接),给其注释起来。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4HsPmlH1-1662343970180)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220903222354306.png)]

        后台运行
    在这里插入图片描述

    #启动redis服务
    [root@localhost redis-4.0.0]# src/redis-server ./redis.conf
    #客户端进行链接
    [root@localhost redis-4.0.0]# src/redis-cli -h localhost -p 637945
    
    #输入密码
    localhost:6379> auth 123456 
    ok
    
    #客户端进行链接时,直接进行密码认证
    [root@localhost redis-4.0.0]# src/redis-cli -h localhost -p 6379 -a 123456
    
    #设置可以让其远程客户端链接
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    🚄 数据类型

        Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

    • 字符串 string
    • 哈希 hash
    • 列表 list
    • 集合 set
    • 有序集合 sorted set(zset)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rNTFPOYq-1662343970181)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220903211447540.png)]

    🚒 常用命令

    更多命令可以参考Redis中文网:https://www.redis.net.cn

    详细内容阅读请移步到本链接

    🚬 字符串 string 操作命令
    • Redis 中字符串类型常用命令:
      • SET key value 设置指定key的值
      • GET key 获取指定key的值
      • SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
      • SETNX key value 只有在 key 不存在时设置 key 的值
    🚬 哈希 hash 操作命令
    • Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:
      • HSET key field value 将哈希表 key 中的字段 field 的值设为 value
      • HGET key field 获取存储在哈希表中指定字段的值
      • HDEL key field 删除存储在哈希表中的指定字段
      • HKEYS key 获取哈希表中所有字段
      • HVALS key 获取哈希表中所有值
      • HGETALL key 获取在哈希表中指定 key 的所有字段和值

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EsTfv53L-1662343970181)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220905095744691.png)]

    🚬 列表 list 操作命令
    • Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
      • LPUSH key value1 [value2] 将一个或多个值插入到列表头部
      • LRANGE key start stop 获取列表指定范围内的元素
      • RPOP key 移除并获取列表最后一个元素
      • LLEN key 获取列表长度
      • BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时 或发现可弹出元素为止

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IEVzD8UF-1662343970182)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220905095801031.png)]

    🚬 集合 set 操作命令
    • Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:
      • SADD key member1 [member2] 向集合添加一个或多个成员
      • SMEMBERS key 返回集合中的所有成员
      • SCARD key 获取集合的成员数
      • SINTER key1 [key2] 返回给定所有集合的交集
      • SUNION key1 [key2] 返回所有给定集合的并集
      • SDIFF key1 [key2] 返回给定所有集合的差集
      • SREM key member1 [member2] 移除集合中一个或多个成员

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DRqSTT3-1662343970182)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220905095839981.png)]

    🚬 有序集合 sorted set(zset) 操作命令

         Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score) 。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。

    • 常用命令:
      • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数
      • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
      • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
      • ZREM key member [member …] 移除有序集合中的一个或多个成员

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGgRofHQ-1662343970182)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220905095852531.png)]

    🚬 通用命令
    • KEYS pattern 查找所有符合给定模式( pattern)的 key
    • EXISTS key 检查给定 key 是否存在
    • TYPE key 返回 key 所储存的值的类型
    • TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
    • DEL key 该命令用于在 key 存在是删除 key
    • flushall 清空所有的key

    🚤 Java中操作Redis

    Redis 的 Java 客户端很多,官方推荐的有三种:

    • Jedis
    • Lettuce
    • Redisson

        Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis

    🚬 使用Jedis操作Redis

    使用Jedis操作Redis的步骤:

    • ①获取连接
    • ②执行操作
    • ③关闭连接

    Jedis的maven坐标:

            
            <dependency>
                <groupId>redis.clientsgroupId>
                <artifactId>jedisartifactId>
                <version>2.8.0version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用Jedis操作Redis

    /**
     * 使用Jedis操作Redis
     */
    public class JedisTest {
    
        @Test
        public void testRedis(){
            //1 获取连接
            Jedis jedis = new Jedis("localhost",6379);
            
            //2 执行具体的操作
            jedis.set("username","xiaoming");
    
            String value = jedis.get("username");
            System.out.println(value);
    
            //jedis.del("username");
    
            jedis.hset("myhash","addr","bj");
            String hValue = jedis.hget("myhash", "addr");
            System.out.println(hValue);
    
            Set<String> keys = jedis.keys("*");
            for (String key : keys) {
                System.out.println(key);
            }
    
            //3 关闭连接
            jedis.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    🚬 Spring Boot 项目中,可以使用Spring Data Redis来简化Redis(常用)

        一般不使用原声的RedisTemplate模板,使用自定义的RedisTemplate 自定义模板链接

        Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

    • ValueOperations:简单K-V操作
    • SetOperations:set类型数据操作
    • ZSetOperations:zset类型数据操作
    • HashOperations:针对map类型的数据操作
    • ListOperations:针对list类型的数据操作

    Spring Boot的maven坐标:

            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-data-redisartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Redis配置类

    /**
     * Redis配置类
     */
    
    @Configuration
    public class RedisConfig extends CachingConfigurerSupport {
    
        @Bean
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
    
            //默认的Key序列化器为:JdkSerializationRedisSerializer
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    
            redisTemplate.setConnectionFactory(connectionFactory);
    
            return redisTemplate;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    application.yml

    spring:
      application:
        name: springdataredis_demo
      #Redis相关配置
      redis:
        host: localhost
        port: 6379
        #password: 123456
        database: 0 #操作的是0号数据库
        jedis:
          #Redis连接池配置
          pool:
            max-active: 8 #最大连接数
            max-wait: 1ms #连接池最大阻塞等待时间
            max-idle: 4 #连接池中的最大空闲连接
            min-idle: 0 #连接池中的最小空闲连接
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    使用Spring Boot操作Redis

    package com.itheima.test;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.redis.connection.DataType;
    import org.springframework.data.redis.core.*;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.List;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class SpringDataRedisTest {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        /**
         * 操作String类型数据
         */
        @Test
        public void testString(){
            redisTemplate.opsForValue().set("city123","beijing");
    
            String value = (String) redisTemplate.opsForValue().get("city123");
            System.out.println(value);
    
            redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);
    
            Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
            System.out.println(aBoolean);
        }
    
        /**
         * 操作Hash类型数据
         */
        @Test
        public void testHash(){
            HashOperations hashOperations = redisTemplate.opsForHash();
    
            //存值
            hashOperations.put("002","name","xiaoming");
            hashOperations.put("002","age","20");
            hashOperations.put("002","address","bj");
    
            //取值
            String age = (String) hashOperations.get("002", "age");
            System.out.println(age);
    
            //获得hash结构中的所有字段
            Set keys = hashOperations.keys("002");
            for (Object key : keys) {
                System.out.println(key);
            }
    
            //获得hash结构中的所有值
            List values = hashOperations.values("002");
            for (Object value : values) {
                System.out.println(value);
            }
        }
    
        /**
         * 操作List类型的数据
         */
        @Test
        public void testList(){
            ListOperations listOperations = redisTemplate.opsForList();
    
            //存值
            listOperations.leftPush("mylist","a");
            listOperations.leftPushAll("mylist","b","c","d");
    
            //取值
            List<String> mylist = listOperations.range("mylist", 0, -1);
            for (String value : mylist) {
                System.out.println(value);
            }
    
            //获得列表长度 llen
            Long size = listOperations.size("mylist");
            int lSize = size.intValue();
            for (int i = 0; i < lSize; i++) {
                //出队列
                String element = (String) listOperations.rightPop("mylist");
                System.out.println(element);
            }
        }
    
        /**
         * 操作Set类型的数据
         */
        @Test
        public void testSet(){
            SetOperations setOperations = redisTemplate.opsForSet();
    
            //存值
            setOperations.add("myset","a","b","c","a");
    
            //取值
            Set<String> myset = setOperations.members("myset");
            for (String o : myset) {
                System.out.println(o);
            }
    
            //删除成员
            setOperations.remove("myset","a","b");
    
            //取值
            myset = setOperations.members("myset");
            for (String o : myset) {
                System.out.println(o);
            }
    
        }
    
        /**
         * 操作ZSet类型的数据
         */
        @Test
        public void testZset(){
            ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    
            //存值
            zSetOperations.add("myZset","a",10.0);
            zSetOperations.add("myZset","b",11.0);
            zSetOperations.add("myZset","c",12.0);
            zSetOperations.add("myZset","a",13.0);
    
            //取值
            Set<String> myZset = zSetOperations.range("myZset", 0, -1);
            for (String s : myZset) {
                System.out.println(s);
            }
    
            //修改分数
            zSetOperations.incrementScore("myZset","b",20.0);
    
            //取值
            myZset = zSetOperations.range("myZset", 0, -1);
            for (String s : myZset) {
                System.out.println(s);
            }
    
            //删除成员
            zSetOperations.remove("myZset","a","b");
    
            //取值
            myZset = zSetOperations.range("myZset", 0, -1);
            for (String s : myZset) {
                System.out.println(s);
            }
        }
    
        /**
         * 通用操作,针对不同的数据类型都可以操作
         */
        @Test
        public void testCommon(){
            //获取Redis中所有的key
            Set<String> keys = redisTemplate.keys("*");
            for (String key : keys) {
                System.out.println(key);
            }
    
            //判断某个key是否存在
            Boolean itcast = redisTemplate.hasKey("itcast");
            System.out.println(itcast);
    
            //删除指定key
            redisTemplate.delete("myZset");
    
            //获取指定key对应的value的数据类型
            DataType dataType = redisTemplate.type("myset");
            System.out.println(dataType.name());
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
  • 相关阅读:
    根据excel批量修改文件夹及其文件名称
    Linux screen命令解决SSH远程服务器训练代码断开连接后运行中断
    你猜 1 行Python代码能干什么呢?神奇的单行 Python 代码
    Apache ECharts简介
    linux操作系统中业务程序及服务的开机启动
    kafka 相关概念
    第四届辽宁省大学生程序设计竞赛(正式赛)A B H F M C
    JS-Vue-属性 表单 事件绑定
    Spring Security是什么? - 密码认证(四)
    【计算机网络】-性能指标(速率、带宽和吞吐量)
  • 原文地址:https://blog.csdn.net/gh_xiaohe/article/details/126699555