Spring Data 家族之Redis
前言:
自從換了一份作業之后,忙了很多很少有時間去分享自己最近學的東西了但還是要對所學的知識做輸出
Spring Data 對常見的noSql 中間件都做了對應的模板封裝 ,其中Redis 是我們經常使用的一個快取服務,我們經常使用的 5大資料型別都做了對應的操作封裝,下面依次講講對應的api 操作,這里使用一個boot 工程來演示,
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId><!--使用json序列化-->
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
配置RedisConfig
/**
* @author wym
* @date 2021/3/1 22:18
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 設定
template.setValueSerializer(new StringRedisSerializer());
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om =new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
1.String
String是redis最基本的型別,在redis中,一個key對應一個value
/**
* @Autowired默認按型別進行裝配,
* @Resource默認按照名稱進行裝配
* redis 默認是 <Object ,Object> 型別
*/
@Resource
private RedisTemplate<String,Object> redisTemplate;
/**
*測驗
*/
@Test
void test(){
ValueOperations<String, Object> string = redisTemplate.opsForValue();
string.set("name","翁艷敏");
}
/**
* set
*/
@Test
void testSet(){
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
//直接設定 key value
operations.set("name","wym");
//設定偏移量 從哪里開始
operations.set("name","wym2",3);
//設定10分鐘過期 10 , 單位
operations.set("name","wym3",10, TimeUnit.MINUTES);
//設定批量保存
Map<String,String> map=new HashMap<>();
map.put("name1","wym3");
map.put("name2","wym3");
map.put("name3","wym3");
map.put("name4","wym3");
operations.multiSet(map);
//追加 存在就追加 沒有 就保存 當前這個
operations.append("name4","wym4");
//存在回傳 false 不存在 回傳 true 并 添加 這個 key
Boolean aBoolean = operations.setIfAbsent("lock", "value");
System.out.println(aBoolean);
}
/**
* 獲取
*/
@Test
void testGet() {
ValueOperations<String, Object> string = redisTemplate.opsForValue();
Object name = string.get("name");
System.out.println(name);
//批量獲取
List<String> keys=new ArrayList<>();
keys.add("name");
keys.add("name1");
keys.add("name2");
List<Object> objects = string.multiGet(keys);
for (Object object : objects) {
System.out.println(object);
}
}
/**
* 洗掉
*/
@Test
void testDelete(){
Boolean name = redisTemplate.delete("name");
System.out.println(name);
}
/**
* 測驗自增 和減少
* 使用在 點贊 瀏覽 等業務方面
*/
@Test
void testIncr(){
ValueOperations<String, Object> string = redisTemplate.opsForValue();
//回傳的值
Long age = string.increment("age");
//設定 步長 每次加3
string.increment("age",3);
// 每次減少
string.decrement("money",500);
}
2.Hash
redis hash 是一個鍵值對集合,redis hash 是一個string型別的field和value的映射表,hash特別適合用于存盤物件,類似Java里Map<String,Object> ,user (name age,address ) 等資訊 拿來存放物件資訊等,也可以在業務key 過多時使用統一key
/**
* @Autowired默認按型別進行裝配,
* @Resource默認按照名稱進行裝配
* redis 默認是 <Object ,Object> 型別
*/
@Resource
private RedisTemplate redisTemplate;
@Test
public void testRedisHash(){
HashMap<String, Object> map = new HashMap<>();
map.put("name","weng");
map.put("age", 18);
Map<String, Object> map2 = new HashMap();
map2.put("name", "雷哥");
map2.put("age", 50);
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("user","1",map);
hashOperations.put("user","2",map2);
}
@Test
public void testHashGet(){
HashOperations hashOperations = redisTemplate.opsForHash();
Boolean user = hashOperations.hasKey("user", "1");
System.out.println(user);
Object user1 = hashOperations.get("user", "1");
System.out.println(user1);
Set user2 = hashOperations.keys("user");
for (Object o : user2) {
System.out.println(o);
}
List user3 = hashOperations.values("user");
user3.forEach(System.out::println);
Map user4 = hashOperations.entries("user");
System.out.println(user4);
}
@Test
public void testRemove(){
HashOperations operations = redisTemplate.opsForHash();
Long user = operations.delete("user", "1", "2");
System.out.println(user);
}
3.list
redis list 串列是簡單的字串串列,按照插入順序排序,你可以添加一個元素到串列的頭部(左邊)或者尾部(右邊),它的底層實際是個鏈表,
/**
* @Autowired默認按型別進行裝配,
* @Resource默認按照名稱進行裝配
* redis 默認是 <Object ,Object> 型別
*/
@Resource
private RedisTemplate<String,Object> redisTemplate;
@Test
public void testRedisList(){
ListOperations<String, Object> listList = redisTemplate.opsForList();
listList.leftPush("name","張三");
listList.leftPushAll("names","李四", "王五", "趙六");
listList.rightPush("names","田七");
listList.rightPushAll("names", "王八", "老九");
}
@Test
public void testGet(){
ListOperations<String, Object> operations = redisTemplate.opsForList();// 0代表從左邊開始第一個元素
Object names = operations.index("names", 0);
System.out.println(names);
Object names1 = operations.index("names", -2);
System.out.println(names1);
List<Object> names2 = operations.range("names", 0, 2);
System.out.println(names2);
}
@Test
public void testRemove(){
ListOperations<String, Object> operations = redisTemplate.opsForList();
Object names = operations.rightPop("names");
System.out.println(names);
}
4.set
redis set 和java 在的hashset 類似 不可以重復,string型別的無序集合
/**
* @Autowired默認按型別進行裝配,
* @Resource默認按照名稱進行裝配 redis 默認是 <Object ,Object> 型別
*/
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testAdd() {
SetOperations<String, Object> stringObjectSetOperations = redisTemplate.opsForSet();
stringObjectSetOperations.add("namesSet", "zhangsan", "lisi", "wangwu", "zhangsan");
}
@Test
public void testFind(){
SetOperations<String, Object> stringObjectSetOperations = redisTemplate.opsForSet();
Set<Object> namesSet = stringObjectSetOperations.members("namesSet");
namesSet.forEach(System.out::println);
Object namesSet1 = stringObjectSetOperations.randomMember("namesSet");
System.out.println(namesSet1);
List<Object> namesSet2 = stringObjectSetOperations.randomMembers("namesSet", 2);
System.out.println(namesSet2);
}
@Test
public void testMulti(){
SetOperations<String, Object> operations = redisTemplate.opsForSet();
operations.add("name1", "zhangsan", "lisi", "wangwu", "zhaoliu");
operations.add("name2", "zhangsan", "lisi", "tianqi", "wangba");
//交集
Set<Object> intersect = operations.intersect("name1", "name2");
intersect.forEach(System.out::println);
//并集
Set<Object> union = operations.union("name1", "name2");
union.forEach(System.out::println);
//差集
Set<Object> difference = operations.difference("name1", "name2");
difference.forEach(System.out::println);
}
5.zSet
和set 差不多 ,但內部維護了一個scope 排序
/**
* @Autowired默認按型別進行裝配,
* @Resource默認按照名稱進行裝配 redis 默認是 <Object ,Object> 型別
*/
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testAdd() {
ZSetOperations<String, Object> stringObjectZSetOperations = redisTemplate.opsForZSet();
stringObjectZSetOperations.add("userZset", "zhangsan", 100);
stringObjectZSetOperations.add("userZset", "lisi", 101);
stringObjectZSetOperations.add("userZset", "wangwu", 90);
stringObjectZSetOperations.add("userZset", "zhaoliu", 93);
stringObjectZSetOperations.add("userZset", "tianqi", 92);
}
@Test
public void testGet() {
ZSetOperations<String, Object> operations = redisTemplate.opsForZSet();
Double score = operations.score("userZset", "zhangsan");
System.out.println(score);
}
@Test
public void testList(){
ZSetOperations<String, Object> operations = redisTemplate.opsForZSet();
// 根據排名區間查詢
Set<Object> userZset = operations.range("userZset", 0, 1);
userZset.forEach(System.out::println);
// 通過排名區獲取元素集合和分數
Set<ZSetOperations.TypedTuple<Object>> userZset1 = operations.rangeWithScores("userZset", 0, 2);
for (ZSetOperations.TypedTuple<Object> objectTypedTuple : userZset1) {
String value = (String) objectTypedTuple.getValue();
Double score = (Double) objectTypedTuple.getScore();
System.out.println("value: " + value + ", scopre:" + score);
}
// 通過分數區間獲取集合元素
Set<Object> userZset2 = operations.rangeByScore("userZset", 95, 100);
userZset2.forEach(System.out::println);
Set<Object> userZset3 = operations.reverseRangeByScore("userZset", 95, 100);
userZset3.forEach(System.out::println);
// 通過分數區間獲取元素和分數
Set users = operations.rangeByScoreWithScores("userZset", 95, 100);
// 以上都是從小到大排序,從大到小排序,只需要在方法前加上reverse
users.forEach(System.out::println);
}
好了以上就是一些常見的api使用,希望能幫助到大家,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/388425.html
標籤:其他
上一篇:java例外
