关于Redis的一些场景使用,大家共同学习
步骤
1.添加依赖
<!--redis依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置yml
spring:
redis:
host: localhost # Redis服务器地址
database: 0 # Redis数据库索引(默认为0)
port: 6379 # Redis服务器连接端口
password: # Redis服务器连接密码(默认为空)
jedis:
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 3000ms # 连接超时时间(毫秒)
3.直接上代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @description: Redis
* @author: fun
* @create: 2020-04-01 15:19
*/
@Controller
@RequestMapping("/app")
public class RedisController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping(value = "/a", method = RequestMethod.GET)
public void test() {
stringRedisTemplate.opsForValue().set("user1001", "1");
System.out.println("setIfAbsent:" + stringRedisTemplate.opsForValue().get("user1001"));
//setIfAbsent set一个key,如果存在则返回false
Boolean setIfAbsent = stringRedisTemplate.opsForValue().setIfAbsent("user1001", "2");
System.out.println("setIfAbsent,user1001:" + setIfAbsent);
//setIfAbsent set一个key,如果存在则返回true
setIfAbsent = stringRedisTemplate.opsForValue().setIfAbsent("user1002", "2");
System.out.println("setIfAbsent,user1002:" + setIfAbsent);
//multiSet 批量set
Map<String, String> map = new HashMap<>();
map.put("user1003", "2");
map.put("user1004", "2");
map.put("user1005", "2");
stringRedisTemplate.opsForValue().multiSet(map);
List<String> listMulti = stringRedisTemplate.opsForValue().multiGet(map.keySet());
System.out.println("multiGet:" + listMulti.toString());
//multiSetIfAbsent 批量set, 同理setIfAbsent
Map<String, String> mapIfAbsent = new HashMap<>();
mapIfAbsent.put("user1003", "2");
mapIfAbsent.put("user1006", "6");
Boolean multiSetIfAbsent = stringRedisTemplate.opsForValue().multiSetIfAbsent(mapIfAbsent);
System.out.println("multiSetIfAbsent:" + multiSetIfAbsent);
//increment 设置对应的Value值每次递增,默认为1 (分布式下可以用来生成唯一id)
stringRedisTemplate.opsForValue().increment("user1005");
System.out.println("user1005:" + stringRedisTemplate.opsForValue().get("user1005"));
stringRedisTemplate.opsForValue().increment("user1005", 2);
System.out.println("user1005:" + stringRedisTemplate.opsForValue().get("user1005"));
/**
*opsForHash 可以用来实现购物车功能
* 添加商品put
* 添加数量increment
* 查看列表entries或scan
* 查看长度lengthOfValue
* 删除商品delete
*/
stringRedisTemplate.opsForHash().put("cart1001", "10088", "1");
stringRedisTemplate.opsForHash().put("cart1001", "10089", "1");
stringRedisTemplate.opsForHash().put("cart1001", "10090", "1");
stringRedisTemplate.opsForHash().put("cart1001", "10091", "1");
Map<Object, Object> mapEntries = stringRedisTemplate.opsForHash().entries("cart1001");
for (Map.Entry<Object, Object> entry : mapEntries.entrySet()) {
System.out.println("Hash-entries:" + entry.getKey() + ":" + entry.getValue());
}
Long length = stringRedisTemplate.opsForHash().lengthOfValue("cart1001", "10088");
System.out.println("Hash-length:" + length);
Long increment = stringRedisTemplate.opsForHash().increment("cart1001", "10088", 1);
System.out.println("Hash-increment:" + increment);
Cursor<Map.Entry<Object, Object>> cursor = stringRedisTemplate.opsForHash().scan("cart1001", ScanOptions.NONE);
while (cursor.hasNext()) {
Map.Entry<Object, Object> entry = cursor.next();
System.out.println("Hash-cursor-scan:" + entry.getKey() + ":" + entry.getValue());
}
stringRedisTemplate.opsForHash().delete("cart1001", "10088");
mapEntries = stringRedisTemplate.opsForHash().entries("cart1001");
for (Map.Entry<Object, Object> entry : mapEntries.entrySet()) {
System.out.println("Hash-entries-delete:" + entry.getKey() + ":" + entry.getValue());
}
/**
* opsForList 对数据进行有序的操作 可以实现站内消息功能
* leftPush 对用户的消息列表左边添加消息
* rightPush 对用户的消息列表右边添加消息
* leftPop 删除用户的消息列表最左边的一条消息
* rightPop 删除用户的消息列表最右边的一条消息
* range 分页获取这个用户的消息(start, end))
*/
stringRedisTemplate.opsForList().leftPush("user2001", "message002");
stringRedisTemplate.opsForList().leftPush("user2001", "message001");
List<String> listRange = stringRedisTemplate.opsForList().range("user2001", 0, 5);
System.out.println("listRange:" + listRange.toString());
stringRedisTemplate.opsForList().rightPush("user2001", "message003");
stringRedisTemplate.opsForList().rightPush("user2001", "message004");
listRange = stringRedisTemplate.opsForList().range("user2001", 0, 5);
System.out.println("listRange:" + listRange.toString());
stringRedisTemplate.opsForList().leftPop("user2001");
listRange = stringRedisTemplate.opsForList().range("user2001", 0, 5);
System.out.println("listRange:" + listRange.toString());
stringRedisTemplate.opsForList().rightPop("user2001");
listRange = stringRedisTemplate.opsForList().range("user2001", 0, 5);
System.out.println("listRange:" + listRange.toString());
stringRedisTemplate.opsForList().remove("user2001", 1, "message003");
listRange = stringRedisTemplate.opsForList().range("user2001", 0, 2);
System.out.println("listRange:" + listRange.toString());
/**
* opsForSet 用来实现抽奖功能
* add 添加用户 key:奖池名 value:用户id
* members 查看奖池用户
* distinctRandomMembers 抽出中奖用户,但是不删除
* pop 抽出中奖用户,并删除中奖用户
*/
Long countSet = stringRedisTemplate.opsForSet().add("lottery", "1001");
System.out.println("countSet:" + countSet);
countSet = stringRedisTemplate.opsForSet().add("lottery", "1002");
System.out.println("countSet:" + countSet);
countSet = stringRedisTemplate.opsForSet().add("lottery", "1001", "1003", "1004", "1005");
System.out.println("countSet:" + countSet);
Set<String> setMembers = stringRedisTemplate.opsForSet().members("lottery");
System.out.println("setMembers:" + setMembers.toString());
Set<String> distinctRandomMembers = stringRedisTemplate.opsForSet().distinctRandomMembers("lottery", 2);
System.out.println("distinctRandomMembers:" + distinctRandomMembers.toString());
System.out.println("distinctRandomMembers后的list:" + stringRedisTemplate.opsForSet().members("lottery").toString());
List<String> pop = stringRedisTemplate.opsForSet().pop("lottery", 2);
System.out.println("set-pop:" + pop.toString());
System.out.println("set-pop后的list:" + stringRedisTemplate.opsForSet().members("lottery").toString());
/**
* opsForSet 用来实现点赞,收藏等功能
* add 点赞 key:点赞主体(如文章id) value:用户id
* members 查看所有点赞用户
* remove 取消点赞
* isMember 检查是否点赞过
* 获取点赞数
*/
stringRedisTemplate.opsForSet().add("article1001", "1001", "1002", "1003", "1004", "1005");
Set<String> members = stringRedisTemplate.opsForSet().members("article1001");
System.out.println("members:" + members.toString());
Long countSetRem = stringRedisTemplate.opsForSet().remove("article1001", "1001");
System.out.println("countSetRem:" + countSetRem);
Boolean isMember= stringRedisTemplate.opsForSet().isMember("article1001","1001");
System.out.println("isMember-1001:" + isMember);
isMember= stringRedisTemplate.opsForSet().isMember("article1001","1002");
System.out.println("isMember-1002:" + isMember);
Long countAll = stringRedisTemplate.opsForSet().size("article1001");
System.out.println("countAll:" + countAll);
/**
* opsForSet 可以实现好友中的共同关注,可能认识的人,我关注的人也关注了他
*/
stringRedisTemplate.opsForSet().add("1001", "1002", "1003", "1004", "1005");
stringRedisTemplate.opsForSet().add("1002", "1003", "1004", "1005","1006","1007");
Set<String> difference= stringRedisTemplate.opsForSet().difference("1001", "1002");
Set<String> union= stringRedisTemplate.opsForSet().union("1001","1002");
Set<String> intersect= stringRedisTemplate.opsForSet().intersect("1001","1002");
System.out.println("difference两个key的差:" + difference);
System.out.println("union两个key的合集:" + union);
System.out.println("intersect两个key的交集:" + intersect);
isMember= stringRedisTemplate.opsForSet().isMember("1002","1003");
System.out.println("isMember我关注的人也关注了他:" + isMember);
/**
* opsForZSet 排行榜
*/
stringRedisTemplate.opsForZSet().incrementScore("shop001", "card1", 1);
//加法操作
stringRedisTemplate.opsForZSet().incrementScore("shop001", "card1", 1);
//减法操作
stringRedisTemplate.opsForZSet().incrementScore("shop001", "card1", -1);
stringRedisTemplate.opsForZSet().incrementScore("shop001", "card2", 1);
stringRedisTemplate.opsForZSet().incrementScore("shop001", "card2", 1);
stringRedisTemplate.opsForZSet().incrementScore("shop001", "card3", 1);
stringRedisTemplate.opsForZSet().incrementScore("shop002", "card1", 1);
Set<String> range =stringRedisTemplate.opsForZSet().reverseRange("shop001", 0,0);
System.out.println("获取门店shop001使用优惠劵TOP1:" + JSON.toJSONString(range));
Set<ZSetOperations.TypedTuple<String>> rangeWithScores = stringRedisTemplate.opsForZSet().reverseRangeWithScores("shop001", 0, 0);
System.out.println("获取门店shop001使用优惠劵TOP1列表:" + JSON.toJSONString(rangeWithScores));
Long rankNum = stringRedisTemplate.opsForZSet().reverseRank("shop001", "card1");
System.out.println("获取门店shop001中优惠劵card1排名:" + rankNum);
Double score = stringRedisTemplate.opsForZSet().score("shop001", "card1");
System.out.println("获取门店shop001中优惠劵card1使用张数:" + score);
Long count = stringRedisTemplate.opsForZSet().count("shop001", 2, 2);
System.out.println("统计门店shop001中 使用优惠劵2次的优惠劵数量:" + count);
}
}