> 技术文档 > 苍穹外卖项目&第四部Redis技术总结

苍穹外卖项目&第四部Redis技术总结


Redis入门

Redis简介

官网:https://redis.io

中文网:https://www.redis.net.cn/

操作

终端启动语句:.\\redis-server.exe .\\redis.windows.conf

本机连接redis服务:redis-cli.exe(需要重新打开一个终端)

退出:exit

连接其他的redis服务:redis-cli.exe -h localhost(要连接的 Redis 服务器的主机名或 IP 地址) -p 6379(要连接的 Redis 服务器的端口号)

修改密码:在redis.windows.config文件里面找到requirepass foobared,将foobared修改成自己的密码就行了。

客户端界面ARSM使用界面

Redis数据类型

字符串:普通字符串,最基本的数据类型。但是和java里面的字符串有点区别,所以在后续java中操作的时候操作对象显示的是object。

哈希:散列,类似与java的hashmap。

列表:按照插入顺序排序,可以重复元素,类似与java的linkedlist。可以左右随意插入。

集合:没有顺序,没有重复元素,类似与java的hashset。可以用于计算交叉集合。

有序集合:集合中每一个元素会关联一个分数(score),根据分数升序排序,没有重复元素。适合来制作排行榜。

操作命令

字符串操作命令

 哈希操作命令

列表操作命令

集合操作命令

有序集合操作命令

通用命令

Java中操作Redis

Redis的java客户端

Spring Data Redis

maven坐标

在server包的pom文件里面导入坐标

  org.springframework.boot spring-boot-starter-data-redis 

配置数据源

主配置文件

redis: host: ${sky.redis.host} port: ${sky.redis.port} password: ${sky.redis.password} database: ${sky.redis.database}

dev环境文件

 redis: host: localhost port: 6379 password: database: 10

配置类

在sky-server下的config包下创建RedisConfiguration类

@Configuration@Slf4jpublic class RedisConfiguration { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ log.info(\"开始创建redis模板对象...\"); RedisTemplate redisTemplate = new RedisTemplate(); //设置redis的连接工厂对象 redisTemplate.setConnectionFactory(redisConnectionFactory); //设置redis key的序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate; }}

对不同的数据类型的操作代码

字符串数据

//操作字符串类型的数据@Testpublic void testString(){ //set get setex setnx redisTemplate.opsForValue().set(\"city\",\"北京\"); String city = (String)redisTemplate.opsForValue().get(\"city\"); System.out.println(city); redisTemplate.opsForValue().set(\"code\",\"1234\",3, TimeUnit.MINUTES);//第3个参数是时间,第4个参数是时间单位 redisTemplate.opsForValue().setIfAbsent(\"lock\",\"1\"); redisTemplate.opsForValue().setIfAbsent(\"lock\",\"2\"); }

哈希数据

@Testpublic void testHash(){ //hset hget hkeys hvals HashOperations hashOperations = redisTemplate.opsForHash(); hashOperations.put(\"100\",\"name\",\"tom\"); //相当于hset hashOperations.put(\"100\",\"age\",\"20\"); String name = (String)hashOperations.get(\"100\", \"name\"); //相当于hget System.out.println(name); Set keys = hashOperations.keys(\"100\"); //相当于hkeys System.out.println(keys); List values = hashOperations.values(\"100\"); //相当于hvals System.out.println(values); hashOperations.delete(\"100\",\"age\");//相当于hdel }

列表数据

@Testpublic void testList(){ //Lpush lrange rpop llen ListOperations listOperations = redisTemplate.opsForList(); listOperations.leftPushAll(\"mylist\",\"a\",\"b\",\"c\"); //lpush多个value listOperations.leftPush(\"mylist\",\"d\"); //lpush单个value List mylist = listOperations.range(\"mylist\",0,-1); //lrange System.out.println(mylist); listOperations.rightPop(\"mylist\"); //rpop Long size = listOperations.size(\"mylist\"); //llen System.out.println(size);}

集合数据

@Testpublic void testZset(){ //zadd zrange zincrby zrem ZSetOperations zSetOperations = redisTemplate.opsForZSet(); zSetOperations.add(\"zset1\",\"a\",10); //zadd zSetOperations.add(\"zset2\",\"b\",12); zSetOperations.add(\"zset1\",\"c\",9); Set zset1 = zSetOperations.range(\"zset1\",0,-1); //zrange System.out.println(zset1); zSetOperations.incrementScore(\"zset1\",\"c\",10); //zincrby zSetOperations.remove(\"zset1\",\"a\",\"b\"); //zrem}

通用命令

@Testpublic void testCommon(){ //keys exists type del Set keys = redisTemplate.keys(\"*\"); //keys System.out.println(keys); Boolean name = redisTemplate.hasKey(\"name\"); //exists Boolean set1 = redisTemplate.hasKey(\"set1\"); for(Object key : keys){ DataType type = redisTemplate.type(key); //type System.out.println(type.name()); } redisTemplate.delete(\"mylist\"); //del}

店铺营业状态设置

使用Redis来存储状态信息

后端只写了两个简单的修改以及查询状态属性status的值,并没有关系到其他业务逻辑的什么禁用启动,仅仅是向前端返回1或0,逻辑很简单。

代码

@RestController@RequestMapping(\"/admin/shop\")@Slf4jpublic class ShopController { @Autowired private RedisTemplate redisTemplate; public static final String KEY=\"SHOP_STATUS\"; /** * 设置店铺营业状态 * @param status * @return */ @PutMapping(\"/{status}\") public Result setStatus(@PathVariable Integer status) { log.info(\"设置营业状态为:{}\", status==1?\"营业中\":\"打样中\"); redisTemplate.opsForValue().set(KEY, status); return Result.success(); } /** * 获取店铺营业状态 * @return */ @GetMapping(\"/status\") private Result getStatus() { Integer status=(Integer) redisTemplate.opsForValue().get(KEY); return Result.success(status); }}

还需要一模一样书写一个user端的控制类,因为user端访问路径不一样,只需要修改访问路径。教学还涉及了接口文档的分开,因为我没有使用教学中的接口文档技术,所以不需要那么繁琐的操作。建议大家使用Apifox,这个在idea里面也有插件,只需要在接口上面写备注就可以扫描到,很是方便。