一、Linux下安装Redis

1.官网下载安装包 redis-6.2.0.tar.gz

2.程序一般放在/opt目录下,将安装包移动到/opt目录下 mv redis-6.2.0.tar.gz /opt 进行解压.tar -zxvf redis-6.2.0.tar.gz

3.进入redis目录

4.进行环境安装
yum install gcc-c++ 安装c++环境
make 配置需要的所有文件

5.redis的默认安装路径: usr/local/bin

6. 将redis配置文件redis.config复制一份到当前目录下,就是user/local/bin中
mkdir yconfig
cp /opt/redis-6.2.0/redis.conf yconfig

这样以后就可以操作这个配置文件了,避免直接修改原来的配置文件,保证安全。

7.redis默认不是后台启动,需要修改配置文件,让它成为后台启动。

8.启动redis redis-server yconfig/redis.conf 通过启动指定的配置文件来启动redis

通过redis-cli -p 6379进行连接。其中6379是redis的端口号。这样就进入了redis服务。

9 查看redis的进程是否开启(需要再开一个会话窗口)
ps -ef|grep redis

10.关闭redis服务:shutdown

二、整合Redis

(一)Jedis

Jedis 是 Redis 官方推荐的 java连接开发工具,用Java来操作Redis。

首先导入依赖

    <dependencies><!--jedis依赖--><!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.3.0</version></dependency><!--fastjson--><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency></dependencies>

然后连接数据库,用相应的命令,来编码测试。

package com.yang;import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;public class TestRedis {public static void main(String[] args) {//new Jedis对象Jedis jedis = new Jedis("8.129.87.233",6379);//这个时候jedis中的所有命令就是linux中的命令了。System.out.println(jedis.ping());System.out.println("**************************************");testString(jedis);System.out.println("**************************************");testMap(jedis);System.out.println("**************************************");testList(jedis);System.out.println("**************************************");testSet(jedis);}/*** redis存储字符串*/public static void testString(Jedis jedis){jedis.flushDB();//-----添加数据----------jedis.set("name","喜羊羊");//向key-->name中放入了value-->xinxinSystem.out.println(jedis.get("name"));//执行结果:xinxinjedis.append("name", " is my love"); //拼接System.out.println(jedis.get("name"));jedis.del("name");  //删除某个键System.out.println(jedis.get("name"));//设置多个键值对jedis.mset("name","yangg","age","23");jedis.incr("age"); //进行加1操作System.out.println(jedis.get("name") + "-" + jedis.get("age"));}/*** redis操作Map*/public static void testMap(Jedis jedis) {jedis.flushDB();//-----添加数据----------Map<String, String> map = new HashMap<String, String>();map.put("name", "xinxin");map.put("age", "22");map.put("qq", "123456");jedis.hmset("user",map);//取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List//第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数List<String> rsmap = jedis.hmget("user", "name", "age", "qq");System.out.println(rsmap);//删除map中的某个键值jedis.hdel("user","age");System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是nullSystem.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回trueSystem.out.println(jedis.hkeys("user"));//返回map对象中的所有keySystem.out.println(jedis.hvals("user"));//返回map对象中的所有valueIterator<String> iter=jedis.hkeys("user").iterator();while (iter.hasNext()){String key = iter.next();System.out.println(key+":"+jedis.hmget("user",key));}}/*** jedis操作List*/public static void testList(Jedis jedis){jedis.flushDB();//先向key java framework中存放三条数据jedis.lpush("java framework","spring");jedis.lpush("java framework","struts");jedis.lpush("java framework","hibernate");//再取出所有数据jedis.lrange是按范围取出,// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有System.out.println(jedis.lrange("java framework",0,-1));jedis.del("java framework");jedis.rpush("java framework","spring");jedis.rpush("java framework","struts");jedis.rpush("java framework","hibernate");System.out.println(jedis.lrange("java framework",0,-1));}/*** jedis操作Set*/public static void testSet(Jedis jedis){jedis.flushDB();//添加jedis.sadd("user2","yangg");jedis.sadd("user2","xiaohan");jedis.sadd("user2","xiaoli");jedis.sadd("user2","xiaoming");jedis.sadd("user2","who");//移除nonamejedis.srem("user2","who");System.out.println(jedis.smembers("user2"));//获取所有加入的valueSystem.out.println(jedis.sismember("user2", "who"));//判断 who 是否是user集合的元素System.out.println(jedis.srandmember("user2"));System.out.println(jedis.scard("user2"));//返回集合的元素个数}
}

(二)SpringBoot整合Redis

在 SpringBoot2.x 之后,原来底层使用的jedis 被替换为了 lettuce。

jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池! 更像 BIO 模式。

lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像 NIO 模式。

整合:
1.springboot项目导入依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2.在.properties文件中配置连接

<!--redis配置-->
spring.redis.host=8.129.87.233    <!--这里按理来说可以配置127.0.0.1的,但是我的只能写虚拟机的主机名,要不就报错--,可能是因为前面把redis.conf配置文件里的东西改了的问题-->
spring.redis.port=6379

3.测试

package com.yang;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class Redis02SpringbootApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;   //用来操作数据类型的类,源码中封装了不同的数据类型及API@Testvoid contextLoads() {/*opsForValue()  操作字符串,类似于StringopsForList()  操作list,类似于List...除了基本的数据类型的操作,其余我们常用的方法都可以直接通过redisTemplate操作,比如事务,和基本的CRUD比如开启事务redisTemplate.multi();或者获取redis的连接对象RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();connection.flushAll();connection.flushDb();*/redisTemplate.opsForValue().set("key","xiaoming");System.out.println(redisTemplate.opsForValue().get("key"));}}

要注意的是,在操作对象的时候,必须实现序列化才能正确输出。

User对象没有实现序列化时:

package com.yang.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
public class User {private String name;private int age;
}

当操作这个对象时,报错。

这个时候我们只需要让User对象实现序列化即可。
User实现序列化:

package com.yang.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;import java.io.Serializable;@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
public class User implements Serializable {private String name;private int age;
}

测试类:

上面User直接实现序列化接口,是默认的JDK序列化,此外我们还可以使用Json来实现序列化

User:

package com.yang.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
public class User {private String name;private int age;
}

测试类:

package com.yang;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yang.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class Redis02SpringbootApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;   //用来操作数据类型的类,源码中封装了不同的数据类型及API@Testpublic void test() throws JsonProcessingException {User user = new User("yangg", 12);//将对象转换为json格式String jsonUser = new ObjectMapper().writeValueAsString(user);redisTemplate.opsForValue().set("user",jsonUser);System.out.println(redisTemplate.opsForValue().get("user"));}
}

但是如果每次操作数据的时候都要将对象转换的话,太麻烦,所以我们可以自定义一个RedisTemplate。使用的时候指定这个自定义RedisTemplate即可。就不用每次都转了。

自定义RedisTemplate:

package com.yang.conf;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
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   //表明这是个配置类让spring扫描
public class RedisConfig {//固定模板,拿来即用。//编写自己的redisTemplate@Bean@SuppressWarnings("all")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactoryfactory) {// 我们为了自己开发方便,一般直接使用 <String, Object>RedisTemplate<String, Object> template = new RedisTemplate<String,Object>();template.setConnectionFactory(factory);// Json序列化配置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);// String 的序列化StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}}

测试类:

package com.yang;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yang.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class Redis02SpringbootApplicationTests {@Autowired@Qualifier("redisTemplate")    //指定自定义的redisTemplateprivate RedisTemplate redisTemplate;@Testpublic void test() throws JsonProcessingException {User user = new User("yangg", 12);redisTemplate.opsForValue().set("user",user);System.out.println(redisTemplate.opsForValue().get("user"));}
}

除此之外,我们还可以把对数据类型及其他命令的操作,都封装到一个工具类中,使得代码更简洁!

封装Util工具类:

package com.yang.utils;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;@Component
public final class RedisUtil {@Autowired   //注入自定义redisTemplateprivate RedisTemplate<String, Object> redisTemplate;// =============================common============================/*** 指定缓存失效时间* @param key  键* @param time 时间(秒)*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据key 获取过期时间* @param key 键 不能为null* @return 时间(秒) 返回0代表为永久有效*/public long getExpire(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在* @param key 键* @return true 存在 false不存在*/public boolean hasKey(String key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除缓存* @param key 可以传一个值 或多个*/@SuppressWarnings("unchecked")public void del(String... key) {if (key != null && key.length > 0) {if (key.length == 1) {redisTemplate.delete(key[0]);} else {redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(key));}}}// ============================String=============================/*** 普通缓存获取* @param key 键* @return 值*/public Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** 普通缓存放入* @param key   键* @param value 值* @return true成功 false失败*/public boolean set(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 普通缓存放入并设置时间* @param key   键* @param value 值* @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期* @return true成功 false 失败*/public boolean set(String key, Object value, long time) {try {if (time > 0) {redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);} else {set(key, value);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 递增* @param key   键* @param delta 要增加几(大于0)*/public long incr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return redisTemplate.opsForValue().increment(key, delta);}/*** 递减* @param key   键* @param delta 要减少几(小于0)*/public long decr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递减因子必须大于0");}return redisTemplate.opsForValue().increment(key, -delta);}// ================================Map=================================/*** HashGet* @param key  键 不能为null* @param item 项 不能为null*/public Object hget(String key, String item) {return redisTemplate.opsForHash().get(key, item);}/*** 获取hashKey对应的所有键值* @param key 键* @return 对应的多个键值*/public Map<Object, Object> hmget(String key) {return redisTemplate.opsForHash().entries(key);}/*** HashSet* @param key 键* @param map 对应多个键值*/public boolean hmset(String key, Map<String, Object> map) {try {redisTemplate.opsForHash().putAll(key, map);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** HashSet 并设置时间* @param key  键* @param map  对应多个键值* @param time 时间(秒)* @return true成功 false失败*/public boolean hmset(String key, Map<String, Object> map, long time) {try {redisTemplate.opsForHash().putAll(key, map);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建* @param key   键* @param item  项* @param value 值* @return true 成功 false失败*/public boolean hset(String key, String item, Object value) {try {redisTemplate.opsForHash().put(key, item, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建* @param key   键* @param item  项* @param value 值* @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间* @return true 成功 false失败*/public boolean hset(String key, String item, Object value, long time) {try {redisTemplate.opsForHash().put(key, item, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除hash表中的值* @param key  键 不能为null* @param item 项 可以使多个 不能为null*/public void hdel(String key, Object... item) {redisTemplate.opsForHash().delete(key, item);}/*** 判断hash表中是否有该项的值** @param key  键 不能为null* @param item 项 不能为null* @return true 存在 false不存在*/public boolean hHasKey(String key, String item) {return redisTemplate.opsForHash().hasKey(key, item);}/*** hash递增 如果不存在,就会创建一个 并把新增后的值返回** @param key  键* @param item 项* @param by   要增加几(大于0)*/public double hincr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, by);}/*** hash递减** @param key  键* @param item 项* @param by   要减少记(小于0)*/public double hdecr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, -by);}// ============================set=============================/*** 根据key获取Set中的所有值* @param key 键*/public Set<Object> sGet(String key) {try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {e.printStackTrace();return null;}}/*** 根据value从一个set中查询,是否存在** @param key   键* @param value 值* @return true 存在 false不存在*/public boolean sHasKey(String key, Object value) {try {return redisTemplate.opsForSet().isMember(key, value);} catch (Exception e) {e.printStackTrace();return false;}}/*** 将数据放入set缓存** @param key    键* @param values 值 可以是多个* @return 成功个数*/public long sSet(String key, Object... values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 将set数据放入缓存** @param key    键* @param time   时间(秒)* @param values 值 可以是多个* @return 成功个数*/public long sSetAndTime(String key, long time, Object... values) {try {Long count = redisTemplate.opsForSet().add(key, values);if (time > 0)expire(key, time);return count;} catch (Exception e) {e.printStackTrace();return 0;}}/*** 获取set缓存的长度** @param key 键*/public long sGetSetSize(String key) {try {return redisTemplate.opsForSet().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 移除值为value的** @param key    键* @param values 值 可以是多个* @return 移除的个数*/public long setRemove(String key, Object... values) {try {Long count = redisTemplate.opsForSet().remove(key, values);return count;} catch (Exception e) {e.printStackTrace();return 0;}}// ===============================list=================================/*** 获取list缓存的内容** @param key   键* @param start 开始* @param end   结束 0 到 -1代表所有值*/public List<Object> lGet(String key, long start, long end) {try {return redisTemplate.opsForList().range(key, start, end);} catch (Exception e) {e.printStackTrace();return null;}}/*** 获取list缓存的长度* @param key 键*/public long lGetListSize(String key) {try {return redisTemplate.opsForList().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 通过索引 获取list中的值* @param key   键* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推*/public Object lGetIndex(String key, long index) {try {return redisTemplate.opsForList().index(key, index);} catch (Exception e) {e.printStackTrace();return null;}}/*** 将list放入缓存** @param key   键* @param value 值*/public boolean lSet(String key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存* @param key   键* @param value 值* @param time  时间(秒)*/public boolean lSet(String key, Object value, long time) {try {redisTemplate.opsForList().rightPush(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @return*/public boolean lSet(String key, List<Object> value) {try {redisTemplate.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, List<Object> value, long time) {try {redisTemplate.opsForList().rightPushAll(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据索引修改list中的某条数据** @param key   键* @param index 索引* @param value 值* @return*/public boolean lUpdateIndex(String key, long index, Object value) {try {redisTemplate.opsForList().set(key, index, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 移除N个值为value** @param key   键* @param count 移除多少个* @param value 值* @return 移除的个数*/public long lRemove(String key, long count, Object value) {try {Long remove = redisTemplate.opsForList().remove(key, count, value);return remove;} catch (Exception e) {e.printStackTrace();return 0;}}
}

测试类:

package com.yang;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yang.pojo.User;
import com.yang.utils.RedisUtil;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class Redis02SpringbootApplicationTests {@Autowired@Qualifier("redisTemplate")    //指定自定义的redisTemplateprivate RedisTemplate redisTemplate;@Autowiredprivate RedisUtil redisUtil;  //注入自定义util包@Testpublic void test2(){//这个时候所有的东西都在util包中,直接 .方法即可。redisUtil.set("name","yangg");System.out.println(redisUtil.get("name"));}
}

Linux中部署Redis及SpringBoot整合Redis相关推荐

  1. 不要再找了,Java操作Redis、Spring整合Redis及SpringBoot整合Redis这里都有

    文章开始之前先抛出一个问题:Jedis.Lettuce.Redisson以及RedisTemplate几者之间有什么区别,又有什么联系? 如果你心中已经很清晰的有了答案,那么本文你可以很轻松的阅读过去 ...

  2. 8分钟带你学会SpringBoot整合Redis来实现缓存技术

    1.概述 随着互联网技术的发展,对技术要求也越来越高,所以在当期情况下项目的开发中对数据访问的效率也有了很高的要求,所以在项目开发中缓存技术使用的也越来越多,因为它可以极大的提高系统的访问速度,关于缓 ...

  3. Redis学习(含 Springboot 整合 Redis)

    Redis NoSQL (not only sql) 在现代的计算系统上每天网络上都会产生庞大的数据量. 这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理. 1970年 E.F.Codd ...

  4. RedisTemplate操作redis五大类型用法详解(springboot整合redis版本)

    1.案例说明 springboot整合redis之后,提供了操作redis的简便方式 通过通用对象redisTemplate方式操作String,Hash,List,Set SortSet五大数据类型 ...

  5. SpringBoot整合Redis+Redis缓存应用+Redis实现Session共享+...

    一.SpringBoot整合Redis 1.导入依赖 <!--存在Redis依赖--> <dependency><groupId>org.springframewo ...

  6. SpringBoot第九篇: springboot整合Redis

    这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...

  7. Springboot整合redis(lettuce)

    springboot 整合redis(lettuce) 首先确保电脑上装了redis.最好能用redisDesktop查看一下数据情况 redis是一款非常流行的Nosql数据库.redis的功能非常 ...

  8. 【Java进阶】SpringBoot整合Redis

    SpringBoot整合Redis SpringBoot 操作数据:spring-data jpa jdbc mongodb redis SpringData 也是和 SpringBoot 齐名的项目 ...

  9. SpringBoot整合Redis要注意的那些

    前言 昨天自己在重新学习SpringBoot整合Redis时,遇到了一个问题java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/ ...

最新文章

  1. c2c网站开店的流程图_shopee开店入驻?Shopee选品为什么这么重要
  2. 最强人脸检测来了 yolov5 face
  3. 003_数据模型一览
  4. Latent semantic analysis note(LSA)
  5. GDCM:变更dcm文件的序列的测试程序
  6. RPM   YUM
  7. ASP.NET Core 2.1 : 图解路由(2.1 or earler)
  8. 两个有用的minicom命令
  9. 数据结构 - 链表(双向链表学习)
  10. Mysql Group Replication(MGR)搭建
  11. linux终端下载notepad,在Linux系统上安装NotePad++的三种方法介绍
  12. k8s/docker 安装yapi和MongoDB
  13. Python绘图 好用的网址
  14. js实现canvas在线画板
  15. cad动态块制作翻转_CAD中怎么定义旋转动态块?
  16. 中国月球探测标识确定 寓龙的传人登月梦
  17. 【壁上观】AMD ZEN将至能战8核i7 Intel慌不慌?
  18. 电脑桌面显示白色图标无法删除
  19. #matplotlib#如何设置坐标轴显示时间的范围
  20. 中国Linux云计算行业发展前景及趋势分析

热门文章

  1. flash脚本引擎LegendForFlashProgramming0.1版发布
  2. 使用vue实现九宫格抽奖功能
  3. 送福利啦!PaddleCV方向精选项目合集
  4. 数据可视化(一):解构数据可视化——学习笔记
  5. python预测运势_程序员来看看自己星座本月运势吧
  6. linux 基础 基础命令及解压
  7. 开发婚庆APP需要的功能
  8. leetcode每日一题-水壶问题
  9. 跨越原理优缺点_请详述德尔菲法的原理及其主要优缺点。
  10. 微信使用技巧:如何将Mac电脑中的微信暂时锁定!