苍穹外卖项目&第四部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里面也有插件,只需要在接口上面写备注就可以扫描到,很是方便。