【黑马】Java项目实战【苍穹外卖】Day05

Redis入门

Redis简介

基于内存key-value结构数据库,读写性能高,适合存储热点数据(热点商品,资讯,新闻),企业应用广泛

Redis下载与安装

安装包分为Windows和Linux版

Redis的Windows版属于绿色软件,直接解压即可使用,

Redis的启动与停止

在安装目录下,输入cmd开启命令行窗口,输入redis-server.exe redis.windows.conf启动Redis服务,默认端口号6379,按下Ctrl+c,停止服务

在安装目录下,输入cmd开启命令行窗口,输入redis-cli.exe,开启客户端,连接Redis服务,默认连接本地Redis,使用本地端口号6379exit停止连接

Redis的设置

使用redis-cli.exe -h localhost -p 6379选择连接哪一个Redis服务,哪一个端口

修改#requirepass foobared 设置连接密码,foobared为密码,

(error) NOAUTH Authentication required.未认证需要提供密码

redis-cli.exe -h localhost -p 6379 -a 123456, -a XXXXX 输入密码

Redis数据类型

5种常用数据类型及各数据类型特点

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常用命令

字符串操作命令

哈希操作命令

列表操作命令

集合操作命令

有序集合操作命令

通用操作命令

在Java中操作Redis

Redis的Java客户端

常见的几种:

  1. Jedis
  2. Lettuce
  3. Spring Data Redis

Spring Data Redis 是 Spring的一部分,对Redis底层开发进行了高度封装,在Spring项目中,可以使用Spring Data Redis进行操作

Spring Data Redis的使用方式

  1. 导入Spring Data Redis的maven坐标
  2. 配置Redis数据源
  3. 编写配置类,创建RedisTemplate对象
  4. 通过RedisTemplate对象操作Redis

Java操作String类型数据

    /**
     * 操作字符串类型数据
     */
    @Test
    public void testString() {
        //set get setex setnx

        //得到字符串操作对象
        ValueOperations stringOps = redisTemplate.opsForValue();

        stringOps.set("name", "小明");

        String city = (String) stringOps.get("city");
        System.out.println(city);

        stringOps.set("code", "1234", 3, TimeUnit.MINUTES);
        //传入任意类型数据,序列化为String类型存储
        stringOps.setIfAbsent("lock", "1");
        stringOps.setIfAbsent("lock", "2");
    }

Java操作哈希类型数据

    /**
     * 操作哈希类型数据
     */
    @Test
    public void testHash() {
        //Hset Hget Hdel Hkeys Hvals
        HashOperations hashOps = redisTemplate.opsForHash();

        hashOps.put("100", "name", "tom");
        hashOps.put("100", "age", "20");

        String name = (String) hashOps.get("100", "name");
        System.out.println(name);

        Set keys = hashOps.keys("100");
        System.out.println(keys);

        List values = hashOps.values("100");
        System.out.println(values);

        hashOps.delete("100", "age");


    }

Java操作其他类型数据

    /**
     * 操作列表类型数据
     */
    @Test
    public void testList() {
        //Lpush Lrange rpop llen
        ListOperations listOps = redisTemplate.opsForList();
        listOps.leftPushAll("mylist", "a", "b", "c");
        listOps.leftPush("mylist", "b");

        List mylist = listOps.range("mylist", 0, -1);
        System.out.println(mylist);

        listOps.rightPop("mylist");

        Long size = listOps.size("mylist");
        System.out.println(size);
    }

    /**
     * 操作集合类型数据
     */
    @Test
    public void testSet() {
        //sadd smembers scard sinter sunion srem

        SetOperations setOps = redisTemplate.opsForSet();

        setOps.add("set1", "a", "b", "c", "d");
        setOps.add("set2", "a", "b", "x", "y");

        Set members = setOps.members("set1");
        System.out.println(members);

        Long size = setOps.size("set1");
        System.out.println(size);

        Set intersect = setOps.intersect("set1", "set2");
        System.out.println(intersect);

        Set union = setOps.union("set1", "set2");
        System.out.println(union);

        setOps.remove("set1", "a", "b");
    }

    /**
     * 操作有序集合类型数据
     */
    @Test
    public void testZset() {
        //zadd zrange zincrby zrem
        ZSetOperations zSetOps = redisTemplate.opsForZSet();

        zSetOps.add("zset1", "a", 10);
        zSetOps.add("zset1", "b", 12);
        zSetOps.add("zset1", "c", 9);

        Set zset1 = zSetOps.range("zset1", 0, -1);
        System.out.println(zset1);

        zSetOps.incrementScore("zset1", "c", 10);

        zSetOps.remove("zset1","a","b");

    }

    /**
     * 操作通用类型数据
     */
    @Test
    public void testCommon(){
        //keys exists type del
        Set keys = redisTemplate.keys("*");
        System.out.println(keys);

        Boolean name = redisTemplate.hasKey("name");
        Boolean set1 = redisTemplate.hasKey("set1");

        for (Object key :keys) {
            DataType type = redisTemplate.type(key);
            System.out.println(type.name());
        }

        redisTemplate.delete("mylist");

    }

店铺营业状态设置

需求分析和设计

接口设计:

  1. 设置营业状态
  2. 管理端查询营业状态
  3. 用户端查询营业状态

营业状态存储方式:基于Redis的字符串来进行存储

代码开发

管理端

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 == 1 ? "营业中" : "打烊中");
        //将店铺营业状态存到redis数据库中
        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 == 1 ? "营业中" : "打烊中");
        return Result.success(status);
    }
}

用户端

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 == 1 ? "营业中" : "打烊中");
        return Result.success(status);
    }
}

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值