目录
3.1.2 添加redis.properties和spring-redis.xml文件.
3.2.2 配置自定义Key生成器CacheKeyGenerator
一、Redis安装及配置
1.1 Redis概述
redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。
redis是一个以key-value存储的数据库结构型服务器,它支持的数据结构类型包括:字符串(String)、链表(lists)、哈希表(hash)、集合(set)、有序集合(Zset)等。为了保证读取的效率,redis把数据对象都存储在内存当中,它可以支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。
1.2 Redis的特点
1)redis数据读写速度非常快,因为它把数据都读取到内存当中操作,而且redis是用C语言编写的,是最“接近”操作系统的语言,所以执行速度相对较快。
2)redis虽然数据的读取都存在内存当中,但是最终它是支持数据持久化到磁盘当中。
3)redis提供了丰富的数据结构。
4)redis的所有操作都是原子性,支持事务,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
5)redis支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
1.3 安装Redis
1.3.1 安装gcc编译器
1)linux中的gcc是由GNU推出的一款功能强大的、性能优越的多平台编译器。gcc编译器能将C、C++语言源程序和目标程序编译、连接成可执行文件。
2)由于redis是用C语言开发,需要在gcc编译器里面进行安装,查看系统是否安装了 gcc编译器:gcc -v;
3)安装 gcc编译器,输入:yum install -y gcc 指令进行安装。
1.3.2 上传并解压redis安装文件
将 redis-5.0.3压缩包上传至 "/usr/local/mytools"目录里面,然后解压。解压命令:tar -zxvf redis-5.0.3.tar.gz
1.3.3 使用make命令进行编译
先进入 redis-5.0.3文件夹,然后输入:make命令进行编译。出现以下内容表示编译成功
1.3.4 安装Redis
进入redis下的src目录,输入:make install命令开始安装,如:
1.4 启动redis的三种方式
1.4.1 黑窗口启动
切换到redis src目录下,输入:./redis-server指令启动redis,效果如下:
1)是这种启动方式需要一直打开窗口,不能进行其他操作,不太方便。
2)退出服务的方式:ctrl+c
1.4.2 以后台进程方式启动
以进程方式在后台运行redis,就是编辑redis的配置文件-redis.conf,把里面的daemonize修改为"yes"
-
复制"redis.conf"文件:
-
把 "redis-5.0.3"目录里面的 "redis.conf"文件复制一份到 "usr/local/bin/"目录,命令:cp /usr/local/redis-5.0.0/redis.conf /usr/local/bin/。
-
-
编辑"redis.conf"文件:
-
把复制的 "/usr/local/bin/redis.conf"文件里面的 "daemonize"的值修改为"yes"。
-
-
指定redis.conf文件启动:
-
这下在启动的时候指定 "usr/local/bin/"目录下"redis.conf"文件启动就可以了,先切换到 redis安装目录的 src目录里面:
-
输入:/usr/local/redis-5.0.0/src;
-
输入:./redis-server /usr/local/bin/redis.conf 命令启动(注意server后面一定要有个空格)。
-
-
查看 redis进程信息:ps -aux | grep redis。
-
杀死进程:kill 进程ID。
1.4.3 开机自启
上面两种的启动方式都比较麻烦,现在我们设置 redis服务为开机自启,那么首先就要把 redis服务注册为系统服务。
在 "/etc/systemd/system/"目录里面创建并编辑 "redis.service"文件:vim /etc/systemd/system/redis.service 添加内容如下:
然后刷新:systemctl daemon-reload。
1.4.3.2 启停redis服务
启动 redis服务:systemctl start redis;
停止 redis服务:systemctl stop redis;
查看 redis的状态:systemctl status redis;
设置 redis服务开机启动:systemctl enable redis;
注:在启动 redis服务的时候有可能会卡主,直接按 ctrl+c退出当前命令即可,但是服务还是正常启动了。
1)如果要解决这个卡主问题,可以把 "Type=forking"配置删除,然后刷新,停止服务,再启动即可
2)如果不删除"Type=forking"配置,操作一次停止服务,再启动貌似也可以。
1.5 设置Redis远程访问
1.5.1 添加redis端口号到防火墙
1)登陆redis,redis服务启动成功之后我们来登陆redis,命令:redis-cli。效果如下:
redis-cli 是 redis的命令行界面。
2)添加redis端口号到防火墙
firewall-cmd --zone=public --add-port=6379/tcp --permanent&&firewall-cmd --reload&&firewall-cmd --zone=public --list-ports。
1.5.2 查看 redis进程
目前 redis只能在本机访问,我们可以通过查看 redis进程进行查看,输入ps -aux | grep redis 查看目前运行的 redis进程,如:
127.0.0.1 表示只能本地访问 reids。
修改 "/usr/local/redis-5.0.0/redis.conf",做如下三处修改:
然后重启 redis服务:systemctl restart redis;
再次查看 redis进程:ps -aux | grep redis 效果如下:
"*"号代表可以远程访问。
用客户端工具远程连接 redis,如:
二、使用java代码操作Redis
2.1 添加依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.2 创建Jedis对象
public static void main(String[] args){
//1.定义ip地址和端口号
String ip = "192.168.247.128";
Integer port = 6379;
//3.创建Jedis对象
Jedis jedis = new Jedis(ip,port);
}
2.3 Java操作redis数据
2.3.1 String
设置值:set:jedis.set("name","张三");
获取值:get:System.out.println(jedis.get("name"));
判断键是否存在:exists:System.out.println(jedis.exists("name"));
设置有效期:expire:jedis.expire("name",10);
删除数据:del:jedis.del("sex");
2.3.2 hash:一般用于存储对象类型数据。
给单个属性赋值
jedis.hset("book","bookName","童话书");
jedis.hset("book","bookPrice","999");
多个属性赋值,结合map集合
Map<String,String> map = new HashMap<>();
map.put("type","童话");
map.put("address","长沙");
jedis.hmset("book",map);
获取单个属性
System.out.println(jedis.hget("book"),("bookName"));
获取所有属性
Map<String,String> book = jedis.hgetAll("book");
System.out.println("book = " + book);
删除多个属性
jedis.hdel("book","bookPrice","bookType");
判断属性是否存在
jedis.hexists("book","bookName");
2.3.3 List
压栈方式添加:先添加的数据会被后面添加的数据挤到右边。
jedis.lpush("address","长沙","株洲","衡阳","郴州");
正常顺序添加:正常顺序依次添加。
jedis.rpush("address","重庆","四川","云南","广西");
获取键的长度
System.out.println(jedis.llen("address"));
循环遍历所有数据
Long len = jedis.llen("address");
for(int i = 0; i < len; i++){
System.out.println(jedis.lindex("address",i));
}
2.3.4 set
添加数据
jedis.sadd("name","hh","oo","qq","xx");
获取数据
ScanResult<String> name = jedis.sscan("name","0");
List<String> result = name.getResult();
result.forEach(System.out::println);
2.3.5 zset(sorted set:有序集合)
添加单条数据
jedis.zadd("zs",999d,"张三");
添加多条数据
Map<String,Double> map = new HashMap<>();
map.put("age",18d);
map.put("score",80d);
jedis.zadd("zs",map);
获取数据
ScanResult<Tuple> zs = jedis.zscan("zs", "0");
List<Tuple> result = zs.getResult();
for(Tuple tuple:result){
String element = tuple.getElement();
double score = tuple.getScore();
System.out.printf("element=%s,score=%s%n",element,score);
}
三、SSM之spring注解式缓存+redis
3.1 spring集成redis配置
3.1.1 添加依赖
//jedis依赖.
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<exclusions>
<exclusion>
<artifactId>commons-pool2</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
</exclusions>
</dependency>
//spring-data-redis依赖.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.4.RELEASE</version>
</dependency>
//日志依赖.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
3.1.2 添加redis.properties和spring-redis.xml文件.
redis.properties里面的内容是连接 reids的相关配置,如:ip、账号密码、端口号、数据过期时间、连接超时时间、最大空闲数等。
spring-redis.xml文件内容:
redis连接池配置:连接池的相关参数来自redis.properties文件。
redis连接工厂配置:主要参数:redis的ip地址、端口号、密码、超时时间。
redis操作模板:操作模板里面主要是把数据转换成 JSON字符串,存储到 redis数据库里面,然后在 java代码里面就不用手动再把数据转换成 JSON字符串了。
spring.xml文件里面引入相关文件.
1).加载配置文件。
注:在 spring里面加载配置文件,只能用一次 <context:property-placeholder>。加载方式如下:
方式一:指定加载多个 .properties配置文件:<context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc.properties,classpath:redis.properties"/>
方式二:使用通配符 * 一次加载所有的 .properties配置文件:<context:property-placeholder location="classpath*:*.properties"/>
2).引入spring与redis集成配置文件:<import resource="classpath:spring-redis.xml"/>
3.2 Spring注解式缓存
3.2.1 配置缓存管理器
在 spring-redis.xml文件里面配置缓存管理器,如:
<bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
<constructor-arg name="redisOperations" ref="redisTemplate" />
<!--redis缓存数据过期时间单位秒-->
<property name="defaultExpiration" value="${redis.expiration}" />
<!-- 是否使用缓存前缀 -->
<!-- 如果缓存的 key本来是 queryBookPager,那么加上缓存前缀后就是:-cache-queryBookPager -->
<property name="usePrefix" value="true"/>
<property name="cachePrefix">
<bean class="org.springframework.data.redis.cache.DefaultRedisCachePrefix">
<constructor-arg index="0" value="-cache-"/>
</bean>
</property>
</bean>
3.2.2 配置自定义Key生成器CacheKeyGenerator
创建 redis包,添加生成key的工具类:CacheKeyGenerator.java
在 spring-redis.xml文件里面配置自定义 Key的生成器,如:
<bean id="cacheKeyGenerator" class="com.zking.ssm.redis.CacheKeyGenerator"/>。
3.2.3 开启注解式缓存
在 spring-reids.xml文件里面开启注解式缓存:
<cache:annotation-driven cache-manager="redisCacheManager" key-generator="cacheKeyGenerator"/>
注解式缓存里面有两个重要参数:
1) redisCacheManager:缓存管理器,缓存管理器里面有操作reids的模板;
2) cacheKeyGenerator:自定义Key的生成器,通过 CacheKeyGenerator类里面定义的 key的生成规则生成 key
3.3 缓存注解
3.3.1 注解-@Cacheable
配置在方法或类上,作用:本方法执行后,先去缓存看有没有数据,如果没有,从数据库中查找出来,给缓存中存一份,返回结果,下次本方法执行,在缓存未过期情况下,先在缓存中查找,有的话直接返回,没有的话从数据库查找。
value:缓存位置的一段名称,不能为空;
key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL
keyGenerator:指定key的生成策略;
condition:触发条件,满足条件就加入缓存,默认为空,表示全部都加入缓存,支持SpEL。
注:condition是在方法执行前评估, unless是在方法执行后评估。
3.3.2 注解-@CachePut
类似于更新操作,即每次不管缓存中有没有结果,都从数据库查找结果,并将结果更新到缓存,并返回结果。
value:缓存的名称,在 spring 配置文件中定义,必须指定至少一个;
key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合;
condition:缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。
3.3.3 注解-@CacheEvict
用来清除用在本方法或者类上的缓存数据(用在哪里清除哪里);
value:缓存位置的一段名称,不能为空;
key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL;
condition:触发条件,满足条件就加入缓存,默认为空,表示全部都加入缓存,支持SpEL;
allEntries:true表示清除value中的全部缓存,默认为false。