redis实战demo

新建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就写到这里了
累了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值