[苍穹外卖]-05Redis快速入门

news2024/9/21 10:57:01

Redis入门

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

  1. 基于内存存储, 读写性能高
  2. 适合存储热点数据(热点商品,咨询,新闻)
  3. 企业应用广泛
  4. 中文官网: Redis中文网
  5. 英文网: https://rsdis.io

下载安装: Redis安装包分为Windows版本和Linux版本, Redis的windows版属于绿色软件, 解压后就能用

  1. 资料中已经提供了的安装包

  1. 解压后的核心文件

启动Redis服务: 进入到安装目录, 执行命令 redis-server.exe redis.windows.conf

  1. 命令格式: 启动命令 空格 配置文件
  2. 停止服务: ctrl + c
  3. redis默认执行在6379端口
  4. 双击 redis-server.exe 也可以快速启动redis服务

连接本地或者远程数据库

  1. 连接本地数据库, 执行 redis-cli.exe 命令,
  2. 验证连接执行 keys * 命令
  3. 退出连接执行 exit 命令
  4. 连接远程数据库, 执行 redis-cli.exe -h localhost -p 379 -a 12345 命令
  5. -h后边跟地址 -p后边跟端口 -a后边跟密码(默认无密码)

配置数据库的连接密码

  1. 关闭服务和连接
  2. 打开配置文件 redis.windows.conf
  3. 查找配置项

  1. 配置密码

Redis图形化操作工具

  1. 资料中有提供, 傻瓜式安装即可

  1. 使用图形化工具连接数据库

Redis数据类型

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

  1. 字符串string: 普通字符串, Redis中最简单的数据类型
  2. 哈希hash: 也叫散列, 类似于java中的HashMap结构, 类似于对象
  3. 列表list: 按照插入顺序排序, 可以有重复元素, 类似与java中的LinkedList, 类似于数组
  4. 集合set: 无序集合, 没有重复的元素, 类似于java中的HashSet, 类似于无需不重复的数组
  5. 有序集合sorted set / zset: 集合中每个元素关联一个分数(score), 根据分数升序排序, 没有重复元素

常用命令

在Redis中, 不同的数据类型, 操作数据的命令是不同的, 并且操作命令不区分大小写

字符串操作命令

set name jack 
ok // 创建一个key, 名称是name, 值是jack

get name
jack // 获取name这个key的值

get aaa
null // 获取不存在的key的值, 返回null

setnx code 30 1234
ok //创建一个key,名称是code,值是1234, 有效期是30s, 到期自动删除

setnx age 18
1 // 创建一个key, 名称是age, 值是18
setnx age 20
0 // 创建失败, 因为age已经存在

哈希操作命令: Redis hash 是一个string类型的 field 和 value的映射表, hash特别适合用于储存对象

HSET 100 name xiaoming
1 // 创建一个key,名称是100, 属性名是name, 属性值是xiaoming
HSET 100 age 22
1 // 往100这个key添加属性, 属性名是age, 属性值是11

HGET 100 name
xiaoming //获取100这个key的name属性的值

HDEL 100 name
1 // 删除100这个key的name属性

HKEYS 100
age name // 获取100这个key中的所有属性名

HVALS 100
22 xiaoming // 获取100这个key中的所有属性值

列表操作命令: Redis列表是简单的字符串列表, 按照插入顺序排序, 可以理解为数组

LPUSH mylist a b c
3 //创建mylist列表,将abc 3个值插入到列表头部
LPUSH mylist a b c
4 //将d插入到列表头部

LRANGE mylist 0 -1
d c b a // 获取mylist列表指定范围内的元素

RPOP mylist
a //移除并返回列表最后一个元素
 
LLEN mulist
3 //获取列表长度

集合操作命令: Redis set 是string类型的无序集合, 集合成员是唯一的, 集合中不能出现重复数据

SADD set1 a b c d
4 // 新建set1集合,添加abcd 4个成员

SADD set1 a
0 // 向set1集合中添加a成员,失败,因为已存在

SMEMBERS set1
c d b a //返回set1集合中所有的成员

SCARD set1
4 // 获取set1集合的成员数

SADD set2 a b x y
4 // 新建set2集合,添加abxy 4个成员

SINTER set1 set2
b a //返回两个集合的交集

SUNION set1 set2
c y d a x b // 返回两个集合的并集
 
SREM set1 a
1 // 删除set1集合中的a成员 

有序集合操作命令: Redis有序集合是string类型元素的集合, 且不允许有重复成员, 每个元素都会关联一个double类型的分数

ZADD zset1 10.0 a 10.5 b
2 //新建zset1集合,并添加ab两个成员,并指定成员分数 

ZADD zset1 10.2 c
1 //向zset1集合添加c成员,并指定成员分数 

ZRANGE zset1 0 -1
a c b //通过索引区间查询zset1集合中的成员

ZRANGE zset1 0 -1 withscore
a 10 c 10.2 b 10.5 //查询zset1集合中的成员和分数

ZINCRBY zset1 5.0 a
15 //对zset1集合中的a成员,加上5.0分

ZREM zset1 b
1 //移除zset1集合中的b成员

通用命令: 不分数据类型都可以使用的命令

KEYS *
mylist key1 name set1 set2 zset1 //查询所有key

KEYS set*
set1 set2 //查询所有以set开头的key

EXISTS name
1  //检查给定Key是否存在

TYPE name
string //返回key所储存的值的类型
  
DEL name set1 zset1
3 //在key存在时删除key

java操作Redis

Redis的java客户端很多, 根据项目情况按需选择

  1. Jedis: 对Redis命令进行封装, 语法与Redis命令保持一致
  2. Lettuce: 基于多线程的Redis封装,特点是性能好
  3. Spring Date Redis: 是Spring的一部分, 对Redis底层开发包进行了高度封装, 简化Redis操作

Spring Data Redis入门

1.导入mavn坐标

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

2.配置Redis数据源

spring:
  redis:
    host: ${sky.redis.host}
    port: ${sky.redis.port}
    database: ${sky.redis.database}
sky:
  redis:
    host: localhost
      port: 6379
      password: 123456
      database: 0
  • 如果没有配置密码, 密码项可以省略
  • redis会默认创建16个独立的数据库, 默认使用0号数据库
  • 可以修改 datebase 属性切换数据库
  • 每个数据库的数据是隔离的

3.编写配置类,创建RedisTemplate对象

@Configuration //标明配置类
@Slf4j
public class RedisConfiguration {
    @Bean //项目启动时完成自动配置(按照类型自动注入对象)
    public RedisTemplate redisTemplate (RedisConnectionFactory redisConnectionFactory) {
        // 1.redisConnectionFactory是redis连接工厂对象
        // 2.这个对象不用我们创建, redis起步依赖中已经创建好了
        // 3.我们只需要通过@Bean注解, 让spring把这个对象注入进来就行
        
        log.info("开始创建redis模版对象...");
        RedisTemplate redisTemplate = new RedisTemplate<>();
        
        // 设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        
        // 设置redis key的序列化器
        // StringRedisSerializer() -> 创建字符串类型的redis序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        
        return redisTemplate;
    }
}

4.通过RedisTemplate对象操作Redis

新建单元测试类: test/java/右键/new/java class/com.sky.test.SpringDataRedisTest

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test // 声明单元测试方法
    public void testRedisTemplate() {
        // 检查redis模版对象是否成功创建
        System.out.println(redisTemplate);
        // 1.redis中不同的数据类型有不同的操作命令
        // 2.要通过redis模版对象,拿到数据操作对象
        // 3.通过不同的数据操作对象操作数据
        ValueOperations valueOperations = redisTemplate.opsForValue();
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations listOperations = redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        
    }

}

使用字符串操作对象操作字符串类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testString(){
        //原始命令 set get setex setnx 
        
        redisTemplate.opsForValue().set("city","北京");  // 添加数据
        String city = (String) redisTemplate.opsForValue().get("city");  //获取数据
        redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);  //添加数据(设置超时时间)
        redisTemplate.opsForValue().setIfAbsent("lock","1");  //只有在key不存在时添加数据

    }
}
  1. 设置redis的key的序列化器的作用

使用哈希操作对象操作哈希类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void textHash() {
        //原始命令 hset hget hdel hkeys hvals 
        
        HashOperations hashOperations = redisTemplate.opsForHash();

        hashOperations.put("100", "name", "tom");  // 设置数据
        hashOperations.put("100", "age", "18");   // 设置数据
        String name = (String) hashOperations.get("100", "name");  // 获取指定数据
        Set keys = hashOperations.keys("100"); // 获取所有key
        List values = hashOperations.values("100"); // 获取所有value
        hashOperations.delete("100", "age"); // 删除指定数据
    }

}

使用列表操作对象操作列表类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testList() {
        // 原始命令 lpush lrange rpop llen
        
        ListOperations listOperations = redisTemplate.opsForList();

        listOperations.leftPushAll("mylist", "a", "b", "c");  // 插入多条数据
        listOperations.leftPush("mylist", "d");  // 插入单条数据
        List mylist = listOperations.range("mylist", 0, -1);  // 查询全部数据
        listOperations.rightPop("mylist"); // 移除一条数据
        Long size = listOperations.size("mylist");//查看列表长度
    }

}

使用集合操作对象操作集合类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testSet() {
        // 原始命令 sadd smembers scard sinter sunion srem
        
        SetOperations setOperations = redisTemplate.opsForSet();
        setOperations.add("set1", "a", "b", "c", "d");  // 创建集合1
        setOperations.add("set2", "a", "b", "x", "y");  // 创建集合2

        Set members = setOperations.members("set1");  // 获取集合成员
        Long size = setOperations.size("set1");// 获取集合长度
        Set intersect = setOperations.intersect("set1", "set2");// 获取两个集合的交集
        setOperations.union("set1", "set2");  // 获取两个集合的并集
        setOperations.remove("set1", "a", "b");  //  删除集合成员
    }

}

使用有序集合操作对象操作有序集合类型的数据

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testZset() {
        // 原始命令 zadd zrange zincrby zrem
        
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        zSetOperations.add("zset1", "a", 10);  // 添加成员
        zSetOperations.add("zset1", "b", 12);  // 添加成员
        zSetOperations.add("zset1", "c", 9);  // 添加成员
        Set zset1 = zSetOperations.range("zset1", 0, -1);  // 获取zset所有成员
        zSetOperations.incrementScore("zset1", "c", 10);  // 修改成员的排序值
        zSetOperations.remove("zset1", "a", "b");  // 移除成员
    }

}

使用redis模版对象执行通用操作命令

@SpringBootTest // 声明单元测试类
public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testCommon() {
        // 原始命令 keys exists type del
        
        Set keys = redisTemplate.keys("*"); //获取所有的key
        System.out.println(keys);
        Boolean name = redisTemplate.hasKey("name"); //判断是否存在这个key
        Boolean set1 = redisTemplate.hasKey("set1"); //判断是否存在这个key
        // 遍历所有key
        for (Object key: keys) {
            DataType type = redisTemplate.type(key); //获取key的类型
            System.out.println(type.name()); //输出类型的名称
        }
        redisTemplate.delete("mylist");  //删除key
    }

}

店铺状态设置

查看原型, 分析需求, 在管理端可以设置店铺状态

接口设计: 要设计三个接口, 设计营业状态接口, 客户端查询店铺状态接口, 管理端查询店铺状态接口

  1. 管理端发出的请求, 统一使用/admin作为前缀
  2. 用户端发出的请求 ,统一使用/user作为前缀

数据库设计: 如果针对一个字段创建一张表其实并不合适, 所以使用redis数据库, 基于Redis的字符串进行储存

管理端接口

@RestController("adminShopController") // 指定bean的名字
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {
    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 设置店铺的营业状态
     *
     * @param status
     * @return
     */
    @PutMapping("/{status}")
    @ApiOperation("设置店铺的营业状态")
    public Result setStatus(@PathVariable Integer status) {
        log.info("设置店铺营业状态为:{}", status);
        redisTemplate.opsForValue().set(KEY, status);
        return Result.success();
    }
    
    /**
     * 获取店铺的营业状态
     *
     * @return
     */
    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result<Integer> getStatus() {
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取到店铺营业状态:{}", status);
        return Result.success(status);
    }
}

客户端接口

@RestController("userShopController") // 指定bean的名字
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {
    public static final String KEY = "SHOP_STATUS";

    @Autowired
    private RedisTemplate redisTemplate;
    
    /**
     * 获取店铺的营业状态
     *
     * @return
     */
    @GetMapping("/status")
    @ApiOperation("获取店铺的营业状态")
    public Result<Integer> getStatus() {
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        log.info("获取到店铺营业状态:{}", status);
        return Result.success(status);
    }
}

前后端联调测试

分组扫描接口文档: 通过groupName("描述")方法设置接口文档分组扫描

/**
 * 配置类,注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    /**
     * 通过knife4j生成接口文档
     *
     * @return
     */
    @Bean
    public Docket docket1() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("2.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .groupName("管理端接口")
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

    /**
     * 通过knife4j生成接口文档
     *
     * @return
     */
    @Bean
    public Docket docket2() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("苍穹外卖项目接口文档")
                .version("2.0")
                .description("苍穹外卖项目接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .groupName("客户端接口")
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.user"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

}

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

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

相关文章

sqlmap简介及安装

sqlmap简介及安装 sqlmap 介绍 sqlmap 是一个开源的渗透测试工具&#xff0c;可以用来进行自动化检测&#xff0c;利用SQL注入漏洞&#xff0c;获取数据库服务器的权限。它具有功能强大的检测引擎&#xff0c;针对各种不同类型数据库的渗透测试的功能选项&#xff0c;包括获取…

【Hot100】LeetCode—198. 打家劫舍

目录 1- 思路动规五部曲 2- 实现⭐198. 打家劫舍——题解思路 3- ACM 实现 原题链接&#xff1a;198. 打家劫舍 1- 思路 动规五部曲 1- 定义 dp 数组 int[] dp new int[nums.length]dp[i] 代表考虑下标i 偷的最大金币数 2- 递推公式 当偷 i &#xff1a; dp[i-2] nums[i] 当…

Typora调整图片大小:两种方式zoom或width/height

目录 01 zoom方式02 width/height方式2.1 width方式 2.2 height方式 01 zoom方式 语法: <img src"your-image-url" style"zoom:your-zoom-integer"/> 示例&#xff1a;将图片(./image/market.jpg)调整为原图减少50%大小的命令为&#xff1a; …

[数据集][目标检测]肺炎检测数据集VOC+YOLO格式4983张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4983 标注数量(xml文件个数)&#xff1a;4983 标注数量(txt文件个数)&#xff1a;4983 标注…

github actions CICD简单使用案例

参考&#xff1a; https://developer.aliyun.com/article/1540773 https://github.com/ViggoZ/producthunt-daily-hot/blob/main/.github/workflows/generate_markdown.yml 1、创建github项目 目录&#xff1a; .github/workflows/fetch-news.yml actions执行yaml&#xff08;…

Linux 下 C/C++ 程序编译的过程

目录 一、GCC 工具链二、编译过程1、预处理2、编译3、汇编4、链接 本文将介绍如何将 C/C 语言编写的程序转换成为处理器能够执行的二进制代码的过程&#xff0c;包括四个步骤&#xff1a;预处理&#xff08;Preprocessing&#xff09;编译&#xff08;Compilation&#xff09;汇…

如何通过食堂采购小程序端降低成本,提升效率?

随着数字化管理工具的普及&#xff0c;越来越多的食堂正在引入小程序来优化采购流程&#xff0c;减少成本和提升效率。食堂采购小程序端通过技术手段实现了自动化、智能化的管理方式&#xff0c;为管理者提供了极大的便利。本文将探讨如何利用技术手段开发一个高效的食堂采购小…

【MATLAB】数据和字符串类型转换

数据和字符串类型转换 在 MATLAB 中&#xff0c;支持不同数据类型与字符串类型之间的转换&#xff0c;这需要使用不同的函数来实现。此外&#xff0c;相同的数据&#xff0c;特别是整数&#xff0c;可以用多种格式表示&#xff0c;例如十进制、二进制或十六进制。在 C 语言中&a…

vulhub远程执行命令漏洞CVE-2017-12636

1.打开环境 2.访问目标网站 CVE-2017-12636是一个任意命令执行漏洞&#xff0c;我们可以通过config api修改couchdb的配置query_server&#xff0c;这个配置项在设计、执行view的时候将被运行。 3.在网站中发现一个user表&#xff0c;我们可以带你进去看一下 里面是一个用户名…

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目&#xff1a; 牛牛发明了一种新的四舍五…

C语言手撕归并——递归与非递归实现(附动画及源码)

&#x1f916;&#x1f4bb;&#x1f468;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;&#x1f31f;&#x1f680; &#x1f916;&#x1f31f; 欢迎降临张有志的未来科技实验室&#x1f916;&#x1f31f; 专栏&#xff1a;数据结构 &#x1f468;‍&#x1f4bb;&#x1f…

【Python基础】Python函数

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、函数的定义与调用三、函数参数3.1 位置参数3.2 默认参数3.3 可变数量参数&#xff08;或不定长参数…

springboot项目--后端问题记录

springboot项目后端记录 前言一、包1. lombok--自动生成勾子方法作用依赖使用 2. Validated--自动校验作用依赖使用一般参数校验实体参数校验 结论 3. JWT(json web taken) 令牌生成什么是takenJWT包依赖使用获取taken校验 封装的工具类使用 二、处理技巧1. 全局异常处理作用代…

服务器禁用远程(22)

vim /etc/ssh/sshd_config 修改 ListenAddress 0.0.0.0 为ListenAddress localhost 修改完后 重启一下sshd systemctl restart sshd 修改就生效了

【 html+css 绚丽Loading 】000044 两仪穿行轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

数据库的配置2:客户端navicat的安装与连接数据库的方法

二.客户端的配置&#xff1a; 1.navicat ①安装&#xff1a; 破解根据文档进行破解即可 链接: https://pan.baidu.com/s/1M5KUv_fgRlFA50VfcV1VqA 提取码: j4a2 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 安装步骤很简单&#xff0c;直接下一步就好&…

Pandas处理数据,基本应用

Pandas是一个Python包&#xff0c;提供快速、灵活且表达力强的数据结构&#xff0c;旨在使处理“关系型”或“带标签”数据。专门设计用于进行数据分析和操作&#xff0c;它是建立在numpy之上&#xff0c;提供了易于使用的数据结构和数据分析工具。Pandas最主要的数据结构是Dat…

开启Hyper-V之后用不了VMware了,怎么破?

正文共&#xff1a;800 字 7 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了如何在Windows 10操作系统中启用Hyper-V虚拟化服务&#xff08;什么&#xff1f;Windows自带的Hyper-V虚拟化你都没用过&#xff1f;&#xff09;&#xff0c;但是在启用Hyper-V服务之…

vulhub spring 远程命令执行漏洞(CVE-2016-4977)

1.执行以下命令启动靶场环境并在浏览器访问 cd /vulhub/spring/CVE-2016-4977#进入漏洞环境所在目录 docker-compose up -d #启动靶场 docker ps #查看容器信息 2.输入以下命令测试环境 192.168.0.107:8080/oauth/authorize?response_type${2*2}&client_idacme&sc…

RMSE 和 RMS 介绍

RMSE&#xff08;Root Mean Square Error&#xff09;和 RMS&#xff08;Root Mean Square&#xff09;都是衡量误差或数据变动的统计量。它们在数据分析、机器学习和统计中应用广泛。以下是它们的详细介绍&#xff1a; 1. RMSE&#xff08;均方根误差&#xff09; 定义&…