Redis 入門
Redis 簡介
Redis 是一個基于內存的 key-value 結構數據庫。
·基于內存存儲,讀寫性能高
·適合存儲熱點數據(熱點商品,資訊,新聞)
企業應用廣泛
redis 中文網:Redis中文網
Redis 下載與安裝
Redis 的 Windows版屬于綠色軟件,直接解壓即可使用,解壓后目錄結構如下:
Redis 服務啟動與停止
?啟動:在解壓目錄下進入命令行窗口,輸入以下命令即可啟動
結束:直接 Ctrl + C 即可
客戶端連接服務器:
注意服務端不能關,否則連接不上
客戶端斷開:輸入 exit 即可
補充如果我們要連接外部的服務器:
-h 后面寫域名,-p 后面寫端口名
密碼修改:在 conf 文件里找到 443 行這一行,
requirepass 后面跟的就是你需要的密碼
這時我們重啟 Redis,并重新連接客戶端,會發現一個 error 告訴我們未認證
我們要想連接,在之前的命令下加一個 -a yourPassWord 即可
當然我們可以直接下載圖形化工具進行連接
服務端記得不要關
Redis 數據類型
5種常用數據類型介紹
各種數據類型的特點
Redis 常用命令
字符串操作命令
????????
哈希操作命令
列表操作命令
集合操作命令
有序集合操作命令
通用命令
在 Java 中操作 Redis
Redis 的 Java 客戶端
Redis 的 Java 客戶端很多,常用的幾種:
· Jedis
· Lettuce
· Spring Data Redis
Spring Data Redis 是 Spring 的一部分,對 Redis 底層開發包進行了高度封裝。在 Spring 項目中,可以使用 Spring Data Redis 來簡化操作
Spring Data Redis 使用方式
package com.sky.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@Slf4j
public class RedisConfiguration {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate redisTemplate = new RedisTemplate();//設置 redis 的連接工廠對象redisTemplate.setConnectionFactory(redisConnectionFactory);//設置 redis key 的序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}
package com.sky.test;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;@SpringBootTest
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedisTemplate(){System.out.println(redisTemplate);ValueOperations valueOperations = redisTemplate.opsForValue();HashOperations hashOperations = redisTemplate.opsForHash();ListOperations listOperations = redisTemplate.opsForList();SetOperations setOperations = redisTemplate.opsForSet();ZSetOperations zSetOperations = redisTemplate.opsForZSet();}
}
最后是完整的測試代碼,數據庫里面的亂碼是正常的,因為序列化的問題沒有處理
package com.sky.test;import org.junit.jupiter.api.Test;
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 javax.xml.crypto.Data;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;@SpringBootTest
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedisTemplate(){System.out.println(redisTemplate);ValueOperations valueOperations = redisTemplate.opsForValue();HashOperations hashOperations = redisTemplate.opsForHash();ListOperations listOperations = redisTemplate.opsForList();SetOperations setOperations = redisTemplate.opsForSet();ZSetOperations zSetOperations = redisTemplate.opsForZSet();}@Testpublic void testString(){//set get setex setnxredisTemplate.opsForValue().set("city","北京");String city = (String) redisTemplate.opsForValue().get("city");System.out.println(city);redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);redisTemplate.opsForValue().setIfAbsent("local", "1");redisTemplate.opsForValue().setIfAbsent("local", "2");}@Testpublic void testHash(){//hset hget hdel hkeys hvalsHashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("100", "name", "tom");hashOperations.put("100", "age", "20");String name = (String) hashOperations.get("100", "name");System.out.println(name);Set keys = hashOperations.keys("100");System.out.println(keys);List values = hashOperations.values("100");System.out.println(values);hashOperations.delete("100", "name");}@Testpublic void testList(){//lpush lrange rpop llenListOperations listOperations= redisTemplate.opsForList();listOperations.leftPushAll("mylist","a","b","c");listOperations.leftPush("mylist", "d");List list = listOperations.range("mylist", 0, -1);System.out.println(list);listOperations.rightPop("mylist");Long size = listOperations.size("mylist");System.out.println(size);}@Testpublic void testSet(){//sadd smembers scard sinter sunion sremSetOperations setOperations = redisTemplate.opsForSet();setOperations.add("set1", "a","b","c","d");setOperations.add("set2", "a", "b", "x", "y");Set members = setOperations.members("set1");System.out.println(members);Long size = setOperations.size("set1");System.out.println(size);Set intersect = setOperations.intersect("set1", "set2");System.out.println(intersect);Set union = setOperations.union("set1", "set2");System.out.println(union);setOperations.remove("set1", "a", "b");}@Testpublic void testZset(){// zadd zrange zincrby zremZSetOperations 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);System.out.println(zset1);zSetOperations.incrementScore("zset1", "c", 10);zSetOperations.remove("zset1", "a", "b");}@Testpublic void testCommon(){//keys exists type delSet keys = redisTemplate.keys("*");System.out.println(keys);Boolean name = redisTemplate.hasKey("name");Boolean set1 = redisTemplate.hasKey("set1");System.out.println(name);System.out.println(set1);for (Object key : keys) {DataType type = redisTemplate.type(key);System.out.println(type.name());}redisTemplate.delete("mylist");}
}
店鋪營業狀態設置
需求分析和設計
產品原型
接口設計
營業狀態數據存儲方式:基于 Redis 的字符串來進行存儲
代碼開發
package com.sky.controller.admin;import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Slf4j
@Api(tags = "管理端店鋪營業狀態相關接口")
public class ShopController {@AutowiredRedisTemplate redisTemplate;public static final String KEY = "SHOP_STATUS";@GetMapping("/status")@ApiOperation("營業狀態查詢")public Result<Integer> getByStatus(){Integer status = (Integer) redisTemplate.opsForValue().get(KEY);log.info("當前店鋪的營業狀態為:{}", status == 1 ? "營業中": "打樣中");return Result.success(status);}@PutMapping("/{status}")@ApiOperation("營業狀態設置")public Result SetStatus(@PathVariable Integer status){log.info("將當前店鋪的狀態設置為:{}", status);redisTemplate.opsForValue().set(KEY, status);return Result.success();}
}
package com.sky.controller.user;import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController("userShopController")
@RequestMapping("/user/shop")
@Slf4j
@Api(tags = "用戶端店鋪營業狀態相關接口")
public class ShopController {@AutowiredRedisTemplate redisTemplate;public static final String KEY = "SHOP_STATUS";@GetMapping("/status")@ApiOperation("營業狀態查詢")public Result<Integer> result(){Integer status = (Integer) redisTemplate.opsForValue().get(KEY);log.info("當前店鋪的營業狀態為:{}", status == 1 ? "營業中": "打樣中");return Result.success(status);}}