目录
一、Redis安装及配置
1.1 Redis概述
1.2 Redis的特点
1.3 安装Redis
1.3.1 安装gcc编译器
1.3.2 上传并解压redis安装文件
1.3.3 使用make命令进行编译
1.3.4 安装Redis
1.4 启动redis的三种方式
1.4.1 黑窗口启动
1.4.2 以后台进程方式启动
1.4.3 开机自启
1.4.3.2 启停redis服务
1.5 设置Redis远程访问
1.5.1 添加redis端口号到防火墙
1.5.2 查看 redis进程
二、使用java代码操作Redis
2.1 添加依赖
2.2 创建Jedis对象
2.3 Java操作redis数据
2.3.1 String
2.3.2 hash:一般用于存储对象类型数据。
2.3.3 List
2.3.4 set
2.3.5 zset(sorted set:有序集合)
三、SSM之spring注解式缓存+redis
3.1 spring集成redis配置
3.1.1 添加依赖
3.1.2 添加redis.properties和spring-redis.xml文件.
3.2 Spring注解式缓存
3.2.1 配置缓存管理器
3.2.2 配置自定义Key生成器CacheKeyGenerator
3.2.3 开启注解式缓存
3.3 缓存注解
3.3.1 注解-@Cacheable
3.3.2 注解-@CachePut
3.3.3 注解-@CacheEvict
redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。
redis是一个以key-value存储的数据库结构型服务器,它支持的数据结构类型包括:字符串(String)、链表(lists)、哈希表(hash)、集合(set)、有序集合(Zset)等。为了保证读取的效率,redis把数据对象都存储在内存当中,它可以支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。
1)redis数据读写速度非常快,因为它把数据都读取到内存当中操作,而且redis是用C语言编写的,是最“接近”操作系统的语言,所以执行速度相对较快。
2)redis虽然数据的读取都存在内存当中,但是最终它是支持数据持久化到磁盘当中。
3)redis提供了丰富的数据结构。
4)redis的所有操作都是原子性,支持事务,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
5)redis支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
1)linux中的gcc是由GNU推出的一款功能强大的、性能优越的多平台编译器。gcc编译器能将C、C++语言源程序和目标程序编译、连接成可执行文件。
2)由于redis是用C语言开发,需要在gcc编译器里面进行安装,查看系统是否安装了 gcc编译器:gcc -v;
3)安装 gcc编译器,输入:yum install -y gcc 指令进行安装。
将 redis-5.0.3压缩包上传至 "/usr/local/mytools"目录里面,然后解压。解压命令:tar -zxvf redis-5.0.3.tar.gz
先进入 redis-5.0.3文件夹,然后输入:make命令进行编译。出现以下内容表示编译成功
进入redis下的src目录,输入:make install命令开始安装,如:
切换到redis src目录下,输入:./redis-server指令启动redis,效果如下:
1)是这种启动方式需要一直打开窗口,不能进行其他操作,不太方便。
2)退出服务的方式:ctrl+c
以进程方式在后台运行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。
上面两种的启动方式都比较麻烦,现在我们设置 redis服务为开机自启,那么首先就要把 redis服务注册为系统服务。
在 "/etc/systemd/system/"目录里面创建并编辑 "redis.service"文件:vim /etc/systemd/system/redis.service 添加内容如下:
然后刷新:systemctl daemon-reload。
启动 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)登陆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。
目前 redis只能在本机访问,我们可以通过查看 redis进程进行查看,输入ps -aux | grep redis 查看目前运行的 redis进程,如:
修改 "/usr/local/redis-5.0.0/redis.conf",做如下三处修改:
然后重启 redis服务:systemctl restart redis;
再次查看 redis进程:ps -aux | grep redis 效果如下:
"*"号代表可以远程访问。
用客户端工具远程连接 redis,如:
redis.clients
jedis
2.9.0
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);
}
设置值: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");
给单个属性赋值
jedis.hset("book","bookName","童话书");
jedis.hset("book","bookPrice","999");
多个属性赋值,结合map集合
Map map = new HashMap<>();
map.put("type","童话");
map.put("address","长沙");
jedis.hmset("book",map);
获取单个属性
System.out.println(jedis.hget("book"),("bookName"));
获取所有属性
Map book = jedis.hgetAll("book");
System.out.println("book = " + book);
删除多个属性
jedis.hdel("book","bookPrice","bookType");
判断属性是否存在
jedis.hexists("book","bookName");
压栈方式添加:先添加的数据会被后面添加的数据挤到右边。
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));
}
添加数据
jedis.sadd("name","hh","oo","qq","xx");
获取数据
ScanResult name = jedis.sscan("name","0");
List result = name.getResult();
result.forEach(System.out::println);
添加单条数据
jedis.zadd("zs",999d,"张三");
添加多条数据
Map map = new HashMap<>();
map.put("age",18d);
map.put("score",80d);
jedis.zadd("zs",map);
获取数据
ScanResult zs = jedis.zscan("zs", "0");
List 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);
}
//jedis依赖.
redis.clients
jedis
2.9.0
commons-pool2
org.apache.commons
//spring-data-redis依赖.
org.springframework.data
spring-data-redis
1.8.4.RELEASE
//日志依赖.
org.apache.logging.log4j
log4j-slf4j-impl
2.9.1
slf4j-api
org.slf4j
org.apache.logging.log4j
log4j-core
2.9.1
redis.properties里面的内容是连接 reids的相关配置,如:ip、账号密码、端口号、数据过期时间、连接超时时间、最大空闲数等。
spring-redis.xml文件内容:
redis连接池配置:连接池的相关参数来自redis.properties文件。
redis连接工厂配置:主要参数:redis的ip地址、端口号、密码、超时时间。
redis操作模板:操作模板里面主要是把数据转换成 JSON字符串,存储到 redis数据库里面,然后在 java代码里面就不用手动再把数据转换成 JSON字符串了。
spring.xml文件里面引入相关文件.
1).加载配置文件。
注:在 spring里面加载配置文件,只能用一次
方式一:指定加载多个 .properties配置文件:
方式二:使用通配符 * 一次加载所有的 .properties配置文件:
2).引入spring与redis集成配置文件:
在 spring-redis.xml文件里面配置缓存管理器,如:
创建 redis包,添加生成key的工具类:CacheKeyGenerator.java
在 spring-redis.xml文件里面配置自定义 Key的生成器,如:
。
在 spring-reids.xml文件里面开启注解式缓存:
注解式缓存里面有两个重要参数:
1) redisCacheManager:缓存管理器,缓存管理器里面有操作reids的模板;
2) cacheKeyGenerator:自定义Key的生成器,通过 CacheKeyGenerator类里面定义的 key的生成规则生成 key
配置在方法或类上,作用:本方法执行后,先去缓存看有没有数据,如果没有,从数据库中查找出来,给缓存中存一份,返回结果,下次本方法执行,在缓存未过期情况下,先在缓存中查找,有的话直接返回,没有的话从数据库查找。
value:缓存位置的一段名称,不能为空;
key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL
keyGenerator:指定key的生成策略;
condition:触发条件,满足条件就加入缓存,默认为空,表示全部都加入缓存,支持SpEL。
注:condition是在方法执行前评估, unless是在方法执行后评估。
类似于更新操作,即每次不管缓存中有没有结果,都从数据库查找结果,并将结果更新到缓存,并返回结果。
value:缓存的名称,在 spring 配置文件中定义,必须指定至少一个;
key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合;
condition:缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。
用来清除用在本方法或者类上的缓存数据(用在哪里清除哪里);
value:缓存位置的一段名称,不能为空;
key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL;
condition:触发条件,满足条件就加入缓存,默认为空,表示全部都加入缓存,支持SpEL;
allEntries:true表示清除value中的全部缓存,默认为false。