简单了解一下Redis

f6.jpg
## Redis是什么?
Redis是一个基于内存且支持持久化的key-value的NoSQL数据库,其中每个key和value都是使用对象表示的,具有以以下特征:多样数据类型、持久化、主从同步。
## 为什么使用?
1、解决应用服务器的cpu和内存压力。 2、减少io的读操作,减轻io的压力。
## 优点
1、nosql数据库没有关联关系,数据结构简单,拓展表比较容易。2、nosql读取速度快,对较大数据处理快
## 适用场景
数据高并发的读写,
海量数据的读写,
对扩展性要求高的数据
## 怎么使用?
**pom.xml**

 

<!--引入Redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>


**application.yml**

spring:
    redis:
      # Redis数据库索引(默认为0)
      # database: 0
      # Redis服务器地址 
      host: 192.168.1.12
      # Redis服务器连接端口 
      port: 6379
      # Redis服务器连接密码
      password: redispwd@$&*!#&*)&$>...
      # 连接超时时间(毫秒)
      #timeout: 1000
      jedis:
        pool:
      # 连接池最大连接数(使用负值表示没有限制) 
          max-active: 8
          # 连接池中的最大空闲连接  
      max-idle: 500
          # 连接池中的最小空闲连接  
      min-idle: 0
          # 连接池最大阻塞等待时间(使用负值表示没有限制) 
      max-wait: -1


**RedisTemplate模板类(源码)在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化。因此,会出现中文乱码。**
18c119f.jpg

**解决办法:对源码进行改造,封装RedisConfigurtion,重写RedisTemplate**

/**
 * RedisTemplate配置
 * @param factory
 * @return
 */
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
    StringRedisTemplate template = new StringRedisTemplate(factory);
    //定义key序列化方式
    //RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要
    //定义value的序列化方式
    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.setValueSerializer(jackson2JsonRedisSerializer);
    template.setHashValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
}

123.png
**Redis存储数据**

@Autowired
private RedisConfigurtion redisConfigurtion;

@RequestMapping("/net")
public String index(HttpServletRequest request, ModelMap model) {
    RedisTemplate redisTemplate = redisConfigurtion.redisTemplate(null);
    String key = JalorUtils.getKey();
    RedisHandler handler = new RedisHandler();
    handler.setHandid(key);
    handler.setCreatetime(JalorUtils.systemdate());
    handler.setHandle("网站正在被访问!");
    redisTemplate.opsForValue().set(key, handler);
    log.info("进入网站: "+ redisTemplate.opsForValue().get(key));
    return "/net/index.html";
}


**获取Redis库中的数据**

创建 ReadisKVController.java

package com.syjalor.blog.web.controller.redis;

import com.syjalor.blog.modules.redis.RedisConfigurtion;
import com.syjalor.blog.modules.redis.RedisHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.jasper.tagplugins.jstl.core.ForEach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;

import java.util.*;

@Slf4j
@Controller
public class ReadisKVController {

    @Autowired
    private RedisConfigurtion redisConfigurtion;

    /**
     * 获取Redis库中的数据
     * @return
     */
    public List<RedisHandler> getRedis(){
        // 创建LIST集合
        List<RedisHandler> list = new ArrayList<>();
        // redis格式化工具
        RedisTemplate redisTemplate = redisConfigurtion.redisTemplate(null);
        // 获取所有的key
        Set<String> keys = redisTemplate.keys("*");
        // 不用 foreach循环 的原因是,数据是太大时,速度会下降的很明显
        // for (String key : keys) {
        Iterator<String> it = keys.iterator();
        while (it.hasNext()) {
            String key = it.next();
            // 获取key对应的value
            String value = String.valueOf(redisTemplate.opsForValue().get(key));
            /* 截取的第一个字符的位置 */
            String strStart = "(";
            /* 找出指定的2个字符在 该字符串里面的 位置 */
            int strStartIndex = value.indexOf(strStart);
            int strEndIndex = value.indexOf(")");
            /* 开始截取 */
            String result = value.substring(strStartIndex, strEndIndex).substring(strStart.length());
            // 实例化对象
            RedisHandler redisHandler = new RedisHandler();
            //分割后存入数组
            String[] strArr = result.split(",");
            for (String str : strArr) {
                int index = str.indexOf("=");
                String k = str.substring(0, index);
                String v = str.substring(index + 1, str.length());
                if (k.contains("did")) {
                    redisHandler.setHandid(v);
                } else if (k.contains("time")) {
                    redisHandler.setCreatetime(v);
                } else if (k.contains("handle")) {
                    redisHandler.setHandle(v);
                } else if (k.contains("type")) {
                    redisHandler.setType(Integer.parseInt(v));
                }
            }
            list.add(redisHandler);
        }
        return list;
    }

}


***在此,笔者不建议各位使用该方法存储,对照数据一看便知其原因***
`````
处理前
RedisHandler(id=null, handid=20190811120454996077490634776, createtime=2019-08-11 12:04:54, handle=博客网正在被访问!, type=0)
处理后
id=null, handid=201908300531152614058277091328, createtime=2019-08-30 05:31:15, handle=博客网正在被访问!, type=0
可再处理...
`````
**结束语**
`````
以上是Redis的入门知识。笔者本还想谈谈Redis在springboot、springmvc、动态JAVA项目中各自的配置和使用,除了配置和序列化工具的使用有所差异,其原理是相通的。这里就不提供详细的代码了,有兴趣的可以研究一下。

说到这里,笔者不得不提一嘴 Redis 哈希(Hash) ,也是笔者强烈推荐使用的一种数据类型,如果有机会,我会专写一篇 Redis 哈希(Hash)。
`````
 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百度没有我的爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值