一.Redis简介

​   Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,运行在内存中,由ANSI C编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 、MongoDB等。

1.Redis数据结构

​ 字符串类型 string​ 散列类型 hash ​ 列表类型 list 有序可重复​ 集合类型 set 无序不可重复 有序集合类型 sortedset 有序不可重复

2.Redis应用场景

做缓存: 缓存的是使用频次较高,但不是特别重要的数据,请求来时,优先查询非关系型数据库,如果没有查到则查询关系型数据库,从关系型数据库中查询到结果后,将结果存放到非关系型数据库中,并将结果返回给浏览器.如果查询到了,直接将查询结果返回给浏览器即可。

当用户执行 增 删 改操作时,优先操作关系型数据库, (会造成Redis数据丢失)

操作完毕后,删除非关系型数据库中的相关数据. (需要Redis数据同步)

二.Redis持久化:

注意: 要想使用redis的持久化操作,启动redis时必须采用配置文件

使用指定配置文件开启服务 (会持久化) ★★★★★

​ 启动服务器: 在dos命令中输入 redis-server.exe redis.windows.conf

​ 启动客户端: 在dos命令中输入 redis-cli.exe

1.RDB持久化方式: (默认)

rdb方式在持久化数据时,采用快照机制.

​ 执行快照保存的时机:

​ save 900 1 save 300 10 save 60 10000

​ 存在问题: 可能导致数据丢失

在redis的配置文件中已经定义好使用rdb方式进行持久化了,将持久化的数据存放在当前目录的dump.rdb.

redis服务器正常关闭时也会执行持久化操作(快照保存数据)

2.AOF持久化方式:

持久化的是执行过程,每一条命令都会持久化保存

​ 使用方式:

​ 1.开启AOF持久化(修改配置文件)

​ 将配置文件中的 appendonly 改为 yes

​ appendfsync always (我们使用的)

​ # appendfsync everysec

​ # appendfsync no

​ 特点:

​ 不会导致数据丢失.

​ 性能低

三. Jedis

​   Jedis是Redis官方推出的一款面向Java的客户端,提供了很多接口供Java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis、SRP等等,推荐使用Jedis。

  • jdbc: java操作mysql数据的方式

  • jedis: java操作redis数据库的方式

四. Spring Data Redis

​   Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。

  spring-data-redis针对jedis提供了如下功能: 1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类 2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口 ValueOperations:简单K-V操作 SetOperations:set类型数据操作 ZSetOperations:zset类型数据操作 HashOperations:针对map类型的数据操作 ListOperations:针对list类型的数据操作

五.Spring Data Redis操作Redis数据库

第一步:导入相关坐标到Spring项目中

<!-- Redis缓存相关坐标 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>

第二步:在resources下编写redis的配置文件

resources/redis-config.properties

# Redis settings
# server IP
redis.host=192.168.25.130
# server port
redis.port=6379
# server pass
redis.pass=
# use dbIndex
redis.database=0
# maxIdle
redis.maxIdle=300
# maxWait
redis.maxWait=3000
# testOnBorrow
redis.testOnBorrow=true

resources/applicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 1.加载外部配置文件 -->
<context:property-placeholder location="classpath*:properties/*.properties"/> <!-- 2.redis相关配置 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}"/>
<property name="maxWaitMillis" value="${redis.maxWait}"/>
<property name="testOnBorrow" value="${redis.testOnBorrow}"/>
</bean> <!-- 3.Jedis连接工厂的配置 -->
<bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> <!-- 4.redis模板的配置 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="JedisConnectionFactory"/>
</bean> </beans>

第三步:使用redisTemplate模板操作数据库

1.操作String类型数据

/**
* @author Mr.song
* @date 2019/06/12 21:09
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisStrTest { @Autowired
private RedisTemplate redisTemplate; @Test
public void testSetString(){
//模板绑定存储的数据类型为String并存入数据: key是testStr value是DinTalk
redisTemplate.boundValueOps("testStr").set("DinTalk");
} @Test
public void testGetString(){
//模板绑定存储的数据类型为String并取数据:使用key testStr
String testStr = (String) redisTemplate.boundValueOps("testStr").get();
System.out.println(testStr);
} @Test
public void testDelString(){
//直接用模板根据key删除数据,删除后无数据查询返回null
redisTemplate.delete("testStr");
} //使用相同的key重新设置值便是更新
}

2.操作List类型数据

/**
* @author Mr.song
* @date 2019/06/12 21:22
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisListTest { @Autowired
private RedisTemplate redisTemplate; @Test
public void testSetList(){
//模板绑定存储的数据类型为List并存入数据:key是myList,List的数据类型,数据为din.....
redisTemplate.boundListOps("myList").leftPush("din");
redisTemplate.boundListOps("myList").leftPush("talk");
redisTemplate.boundListOps("myList").leftPush("cn");
} @Test
public void testGetList(){
//模板绑定存储的数据类型为List并取数据:key是myList,rang中0是开始,-1是全部
List myList = redisTemplate.boundListOps("myList").range(0, -1);
myList.stream().forEach(System.out::println);
//取list中的一个数据 :先进先出(相当于弹出-删除了)
//String myList = (String) redisTemplate.boundListOps("myList").rightPop();
//System.out.println(myList); //din
} @Test
public void testDelList(){
//直接用模板根据key删除数据(删除整个集合)
redisTemplate.delete("myList");
//指定删除list的数据 :删除一个talk
//redisTemplate.boundListOps("myList").remove(1,"talk");
} //使用相同的key重新设置值便是更新
}

3.操作Set类型数据

/**
* @author Mr.song
* @date 2019/06/12 21:09
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisSetTest { @Autowired
private RedisTemplate redisTemplate; @Test
public void testSetValue(){
//模板绑定存储的数据类型为Set并存入数据: key是mySet value是din talk 等
redisTemplate.boundSetOps("mySet").add("www");
redisTemplate.boundSetOps("mySet").add("din");
redisTemplate.boundSetOps("mySet").add("talk");
redisTemplate.boundSetOps("mySet").add("cn");
} @Test
public void testGetValue(){
//模板绑定存储的数据类型为Set并取数据:使用key为 mySet
Set mySet = redisTemplate.boundSetOps("mySet").members();
mySet.stream().forEach(System.out::println);
} @Test
public void testDelValue(){
//直接用模板根据key删除数据,删除整个Set集合
redisTemplate.delete("mySet");
//redisTemplate.boundSetOps("mySet").remove("www");
} //使用相同的key重新设置值便是更新
}

4.操作ZSet类型数据

/**
* @author Mr.song
* @date 2019/06/12 21:09
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisZSetTest { @Autowired
private RedisTemplate redisTemplate; //ZSet集合有序,数据有分值
@Test
public void testSetValue(){
//模板绑定存储的数据类型为Set并存入数据: key是myZSet value是din talk 等,各有分值
redisTemplate.boundZSetOps("myZSet").add("din",15);
redisTemplate.boundZSetOps("myZSet").add("talk",55);
redisTemplate.boundZSetOps("myZSet").add("www",25);
redisTemplate.boundZSetOps("myZSet").add("cn",45);
} @Test
public void testGetValue(){
//1.模板绑定存储的数据类型为ZSet并取数据:使用key为 myZSet(取一定分值范围的)
//Set myZSet = redisTemplate.boundZSetOps("myZSet").rangeByScore(20, 50);
//myZSet.stream().forEach(System.out::println);
//2.取全部的
//Set myZSet = redisTemplate.boundZSetOps("myZSet").range(0, -1);
//myZSet.stream().forEach(System.out::println);
//3.取数据,带分值
Set<DefaultTypedTuple> myZSet = redisTemplate.boundZSetOps("myZSet").rangeWithScores(0, -1);
for (DefaultTypedTuple defaultTypedTuple : myZSet) {
System.out.println(defaultTypedTuple.getValue());//数据
System.out.println(defaultTypedTuple.getScore());//分值
}
} @Test
public void testDelValue(){
//1.直接用模板根据key删除数据,删除整个ZSet集合
//redisTemplate.delete("myZSet");
//2.删除部分数据
redisTemplate.boundZSetOps("myZSet").removeRangeByScore(15,25);
} //使用相同的key重新设置值便是更新
}

5.操作Hash类型数据

/**
* @author Mr.song
* @date 2019/06/12 21:09
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class RedisHashTest { @Autowired
private RedisTemplate redisTemplate; @Test
public void testSetHash(){
//模板绑定存储的数据类型为Hash并存入数据: key是myHash value是{din:叮}等键值对
redisTemplate.boundHashOps("myHash").put("din","叮");
redisTemplate.boundHashOps("myHash").put("talk","当");
redisTemplate.boundHashOps("myHash").put("song","宋");
redisTemplate.boundHashOps("myHash").put("hui","慧");
} @Test
public void testGetHash(){
//模板绑定存储的数据类型为Hash并取数据:使用key为 myHash,获取键的集合
//Set myHash = redisTemplate.boundHashOps("myHash").keys();
//myHash.stream().forEach(System.out::println);
//获取value的集合(值可重复,所以是list)
//List myHash = redisTemplate.boundHashOps("myHash").values();
//myHash.stream().forEach(System.out::println);
//使用myHash这个key获取到Hash并用键获取值
String s = (String) redisTemplate.boundHashOps("myHash").get("din");
System.out.println(s);
} @Test
public void testDelHash(){
//直接用模板根据key删除数据,删除整个Hash集合
//redisTemplate.delete("myHash");
redisTemplate.boundHashOps("myHash").delete("din");
} //使用相同的key重新设置值便是更新
}

附录1:Linux系统中安装Redis Server

1. 将redis资源包上传到Linux中
2. 执行tar -zxvf redis-3.0.0.tar.gz解压
3. 创建/usr/local/redis目录, //命令 mkdir redis
4. 进入解压的redis-3.0.0,安装redis服务,执行命令:make install PREFIX=/usr/local/redis
5. 复制配置文件将/redis-3.0.0/redis.conf 复制到redis 下的bin 目录下 执行命令:
cp redis.conf /usr/local/redis-cluster/redis-1/bin/
6.启动redis服务

关注微信公众号,随时随地学习

Redis和SpringDataRedis的更多相关文章

  1. redis实现spring-data-redis整合

    java之redis篇(spring-data-redis整合)  博客链接网址:http://www.cnblogs.com/yjmyzz/tag/redis/ redis的知识:官网 1,利用sp ...

  2. Redis 与Spring-data-redis 整合后封装的工具类

    此工具类方法是使用了redis 与spring 整合后,才可以使用的工具类,将 spring-data-redis 一些我们开发中常用的方法进行了封装,方便我们日常开发中进行调用: package c ...

  3. java之redis篇(spring-data-redis整合一)

    redis的知识:官网 1.利用spring-data-redis整合 项目使用的pom.xml: <project xmlns="http://maven.apache.org/PO ...

  4. java之redis篇(spring-data-redis整合)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. java之redis篇(spring-data-redis整合) (转)

    redis的知识:官网 1,利用spring-data-redis整合 项目使用的pom.xml: <project xmlns="http://maven.apache.org/PO ...

  6. Spring中使用RedisTemplate操作Redis(spring-data-redis)

    RedisTemplate如何检查一个key是否存在? return getRedisTemplate().hasKey(key); 由一个问题,复习了一下redis 抄自: https://www. ...

  7. Spring与Redis整合(spring-data-redis)

    maven依赖 <properties> <!-- redis 版本 --> <redis.version>2.9.0</redis.version> ...

  8. Spring之Redis访问(Spring-data-redis)

    Spring-data-redis,是spring-data框架中,比较常用的,基于key-value键值对的数据持久层框架.Spring-data-redis,是一个基于Template模板开发的数 ...

  9. Redis+Shiro+Spring-data-redis,共享Session

    环境:centos7,Java1.8+,一个Nginx,两个Tomcat,一个Redis. 关于共享session的问题大家都应该知道了,传统的部署项目,两个相同的项目部署到不同的服务器上,Nginx ...

随机推荐

  1. java移位运算符实验程序:&lt;&lt;(左移)、&gt;&gt;(带符 号右移)和&gt;&gt;&gt;(无符号右移)

    public class txs { static void leftbit(){ int i;               //整型长度为32位                           ...

  2. excel 学习

    最近越來越感覺到熟練運用office軟件是一門很深的學問,以前一直忽視了這個技能,因爲從來都不覺得這個有什麼技術難度.正是因爲這樣想,所以才一直沒能去好好研究使用這套工具.現在卻覺得有必要學習,在於: ...

  3. 一个程序员对微信小程序的看法

      我们公司用两周的时间开发了一款微信小程序,叫<如e支付>,大家可以去体验一下.由于接口都是写好的,所以开发起来很快.我将从4个不同的角度来介绍我对微信小程序的理解. 1.技术的角度   ...

  4. Override is not allowed when implementing interface method Bytecode Version Overriding and Hiding Methods

    java - @Override is not allowed when implementing interface method - Stack Overflow https://stackove ...

  5. CRM2011部署问题小结

    1 CRM2011部署当插件太多,并且文件太多的时候选择硬盘部署 2 在生产环境这样复杂的CRM2011部署环境的时候弄清楚每台CRM服务器的结构是很重要的弟一步 3 一定要注意DMZ区和内网隔离的, ...

  6. assert的作用是什么

    assert()宏是用于保证满足某个特定条件,用法是: assert(表达式); 如果表达式的值为假,整个程序将退出,并输出一条错误信息.如果表达式的值为真则继续执行后面的语句. 使用这个宏前需要包含 ...

  7. debian webmin 安装

    /******************************************************************** * debian webmin 安装 * 说明: * 在服务 ...

  8. bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】

    --因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...

  9. 洛谷P4116 Qtree3(树剖+线段树)

    传送门 LCT秒天秒地 树剖比较裸的题了 用线段树记录一下区间的最左边的黑点的编号(因为同一条链上肯定是最左边的深度最小,到根节点距离最近) 然后记得树剖的时候肯定是越后面的答案越优,因为深度越浅 / ...

  10. bzoj3316: JC loves Mkk(单调队列+分数规划)

    Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...