新建Springboot工程
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
统一返回和错误码的定义
package com.example.redis.vo;
import lombok.Getter;
@Getter
public enum ResultCode {
SUCCESS(200,"成功"),
Fail(400,"失败"),
NOT_FOUNd(404,"未找到"),
Fail_ERROE(500,"服务器内部错误");
private Integer code;
private String message;
ResultCode(Integer code,String message){
this.code = code;
this.message = message;
}
}
package com.example.redis.vo;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class RetResponse {
private Integer code;
private String message;
private Map<String,Object> map = new HashMap<>();
private RetResponse(){
}
public static RetResponse ok(){
RetResponse retResponse = new RetResponse();
retResponse.setCode(ResultCode.SUCCESS.getCode());
retResponse.setMessage(ResultCode.SUCCESS.getMessage());
return retResponse;
}
public static RetResponse ok(Map<String,Object> map){
RetResponse retResponse = new RetResponse();
retResponse.setCode(ResultCode.SUCCESS.getCode());
retResponse.setMessage(ResultCode.SUCCESS.getMessage());
retResponse.setMap(map);
return retResponse;
}
public static RetResponse error(){
RetResponse retResponse = new RetResponse();
retResponse.setCode(ResultCode.Fail.getCode());
retResponse.setMessage(ResultCode.Fail.getMessage());
return retResponse;
}
public static RetResponse setResult(ResultCode resultCode){
RetResponse retResponse = new RetResponse();
retResponse.setCode(resultCode.getCode());
retResponse.setMessage(resultCode.getMessage());
return retResponse;
}
public RetResponse code(Integer code){
this.setCode(code);
return this;
}
public RetResponse message(String message){
this.setMessage(message);
return this;
}
public RetResponse da(Map<String,Object> map){
this.setMap(map);
return this;
}
}
1.实现网页浏览量统计
redis的key采用String的序列化方式,redis的value采用json的序列化方式
package com.example.redis.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfiguration {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
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);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
controller
package com.example.redis.controller;
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.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PVController {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/pv/detail/{id}")
public String count(@PathVariable("id")Integer id){
Long increment = redisTemplate.opsForValue().increment("book:" + id);
return String.valueOf(increment);
}
}
2.实现抽奖功能
2.1可以无限抽奖
package com.example.redis.service;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class RandomDrawService {
@Autowired
private RedisTemplate redisTemplate;
public static final String RANDOM_KEY = "random:set";
//将所有奖品存入奖品池
@PostConstruct
public void initList(){
if (!redisTemplate.hasKey(RANDOM_KEY)){
for (String key : iniDataList()){
redisTemplate.opsForSet().add(RANDOM_KEY,key);
}
}
}
//存入奖品池中的奖品和数量
private List<String> iniDataList(){
List<String> list = new ArrayList<>();
//10块 10%
for(int i=0;i<10;i++){
list.add("10$"+i);
}
//30块 50%
for (int i=0;i<50;i++){
list.add("30$"+i);
}
//50块 30%
for (int i=0;i<30;i++){
list.add("50$"+i);
}
//100块 10%
for (int i=0;i<10;i++){
list.add("100$"+i);
}
return list;
}
}
package com.example.redis.controller;
import com.example.redis.service.RandomDrawService;
import com.example.redis.vo.RetResponse;
import org.apache.commons.lang3.StringUtils;
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.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class RandomDrawController {
@Autowired
private RandomDrawService randomDrawService;
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/random/draw")
public RetResponse randomDraw(){
String message = null;
String result = (String)redisTemplate.opsForSet().randomMember(randomDrawService.RANDOM_KEY);
if (!StringUtils.isEmpty(result)){
int index = result.indexOf("$");
Integer num = Integer.valueOf(result.substring(0,index));
Map<String,Object> map = new HashMap<>();
map.put("coin",num);
if (num == 10){
message = "恭喜您获得了10块";
} else if (num == 30){
message = "恭喜您获得了30块";
} else if (num == 50){
message = "恭喜您获得了50块";
} else {
message = "恭喜您获得了100块";
}
return RetResponse.ok().message(message).da(map);
}
else {
message = "很抱歉,抽奖时间已过";
return RetResponse.error().message(message);
}
}
}
这段代码应该包一个try-catch
2.2奖品数量有限
package com.example.redis.service;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class LotteryService {
@Autowired
private RedisTemplate redisTemplate;
private static List<String> list;
public static final String LOTTERY = "lottery:set";
static {
list = new ArrayList<>();
//一等奖2个
for (int i=0;i<2;i++){
list.add("1#"+i);
}
//二等奖3个
for (int i=0;i<3;i++){
list.add("2#"+i);
}
//三等奖4个
for (int i=0;i<4;i++){
list.add("3#"+i);
}
//谢谢惠顾5个
for (int i=0;i<5;i++){
list.add("0#"+i);
}
}
@PostConstruct
public void initData(){
Boolean key = redisTemplate.hasKey(LOTTERY);
if (!key){
for (String value : list){
redisTemplate.opsForSet().add(LOTTERY,value);
}
}
}
}
package com.example.redis.controller;
import com.example.redis.service.LotteryService;
import com.example.redis.vo.RetResponse;
import org.apache.commons.lang3.StringUtils;
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.RestController;
@RestController
public class LotteryController {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private LotteryService lotteryService;
@GetMapping("/lottery/card")
public RetResponse lottery(){
String message = null;
String random = (String)redisTemplate.opsForSet().pop(lotteryService.LOTTERY);
if (!StringUtils.isEmpty(random)){
int index = random.indexOf("#");
Integer num = Integer.valueOf(random.substring(0, index));
if (num == 0){
message = "谢谢惠顾";
} else if (num == 1){
message = "一等奖";
} else if (num == 2){
message = "二等奖";
} else {
message = "三等奖";
}
return RetResponse.ok().message(message);
}
else {
message = "抽奖已经结束,下次早点哦";
return RetResponse.error().message(message);
}
}
}
3.黑白名单
package com.example.redis.service;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class BlackListUserService {
@Autowired
private RedisTemplate redisTemplate;
public static final String BLACK_LIST_USER = "blackList:set";
//初始化redis中的黑名单
@PostConstruct
public void initData(){
if (!redisTemplate.hasKey(BLACK_LIST_USER)){
for (Integer value : initDataList()){
redisTemplate.opsForSet().add(BLACK_LIST_USER,value);
}
}
}
//原始黑名单数据 这里应该是从数据库里面查询的
private List<Integer> initDataList(){
List<Integer> blackList = new ArrayList<>();
for (int i=0;i<100;i++){
blackList.add(i+1);
}
return blackList;
}
//添加用户到黑名单
public boolean addBLackList(Integer userid){
//如果用户不在黑名单中
if (!redisTemplate.opsForSet().isMember(BLACK_LIST_USER,userid)){
redisTemplate.opsForSet().add(BLACK_LIST_USER,userid);
//这边还需要写到数据库里面
return true;
}
return false;
}
//从黑名单中删除某个用户
public boolean deleteBlackList(Integer userid){
//如果用户在黑名单中
if (redisTemplate.opsForSet().isMember(BLACK_LIST_USER,userid)){
redisTemplate.opsForSet().remove(BLACK_LIST_USER,userid);
//同步到数据库里面
return true;
}
return false;
}
//查询某个用户是否在黑名单中
public boolean isExistBlackList(Integer userid){
return redisTemplate.opsForSet().isMember(BLACK_LIST_USER,userid) ? true : false;
}
}
package com.example.redis.controller;
import com.example.redis.service.BlackListUserService;
import com.example.redis.vo.RetResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BlackListUserController {
@Autowired
private BlackListUserService blackListUserService;
@GetMapping("/add/blackList/{userid}")
public RetResponse addBlackUser(@PathVariable("userid")Integer userid){
boolean flag = blackListUserService.addBLackList(userid);
if (flag){
return RetResponse.ok().message("用户"+userid+"加入黑名单成功!");
}else {
return RetResponse.error().message("用户"+userid+"加入黑名单失败!");
}
}
@GetMapping("/isExist/blackList/{userid}")
public RetResponse isExistBlackList(@PathVariable("userid")Integer userid){
boolean flag = blackListUserService.isExistBlackList(userid);
if (flag){
return RetResponse.ok().message("用户"+userid+"在黑名单中");
}else {
return RetResponse.error().message("用户"+userid+"不在黑名单中");
}
}
@GetMapping("/delete/blackList/{userid}")
public RetResponse deleteBlackList(@PathVariable("userid") Integer userid){
boolean flag = blackListUserService.deleteBlackList(userid);
if (flag){
return RetResponse.ok().message("用户"+userid+"移除黑名单成功!");
}else {
return RetResponse.error().message("用户"+userid+"移除黑名单失败!");
}
}
}
小demo就写到这里了
累了!