docker系列1:docker安装
docker系列2:阿里云镜像加速器
docker系列3:docker镜像基本命令
docker系列4:docker容器基本命令
docker系列5:docker安装nginx
通过前面4节,对docker有了一个基本了解,包括环境安装及镜像与容器的相关操作命令。
在上一节通过docker安装nginx来体验了一下docker安装的便捷之处,现在通过docker来试试安装redis吧!
之前通过手工的方式安装过单机版本的redis,步骤还是比较烦琐,那么通过docker安装呢?还是参考nginx安装的流程,首先确定redis的版本!
之前在linux服务器上面安装了的linux版本较高,后来ECS服务器到期释放了。最后都是直接用的windows上面的,版本较低:
这次就直接上最新的,通过docker在docker hub上面查找:
确定了redis版本,就可以进行镜像的下载了。
如上讨论,选择redis最新版本来安装,执行命令docker pull redis:
docker pull redis
然后下载成功会显示类似如下信息:
然后再执行镜像查看命令docker images:
现在到了第3步了,那就是通过docker来运行redis!
这里注意的是,因为选择是最新版本了,所以运行的时候:
docker run -it -d --name test_redis redis /bin/bash
执行之后,可以docker ps来查看一下:
经过了上面的三步曲,现在来验证一下redis是否安装成功!可以通过访问服务来验证:
因为是阿里云服务器, redis默认的端口是6379,直接用客户端工具连接会发现失败了!
这个原因在就在于容器的端口没有跟服务器端口进行映射!
把上面的命令稍作修改,并重新启动成功!
docker run -it -d --name test_redis redis -p 6379:6379 /bin/bash
注意服务器的端口需要开放,如果是云服务器还在安全组设置一下
在使用Docker容器时,有时候需要对Redis进行配置,但是Docker镜像中并没有默认的redis.conf,如何设置该文件参考docker没有redis.conf,及redis的下载地址,最终命令:
docker run --name test_redis -p 6379:6379 -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -d redis
再次验证连接信息,显示成功!
当redis搭建好之后,可以通过java连接!还是用原来的tsm工程来测试,因为是springboot框架,所以使用spring-boot-starter-data-redis组件。
org.springframework.boot
spring-boot-starter-data-redis
3.1.3
org.apache.commons
commons-pool2
这里使用上面docker搭建的redis,在application.properties文件里面配置如下:
# ====================================================================================
# spring-redis
# ====================================================================================
# 若没有密码,则需要注释这个配置项
# spring.redis.password=
spring.redis.timeout=10000
# 单机,替换成实际的连接地址
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.min-idle=0
spring.redis.lettuce.pool.max-idle=8
这个组件主要是使用RedisTemplate,主要配置文件如下:
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.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfiguration
{
/**
* spring-boot-autoconfigure的RedisAutoConfiguration自动注册的RedisTemplate,使用的序列化器为默人的JdkSerializationRedisSerializer,序列化后生成的是不利于阅读的编码字符串。
* 所以我们手动注册一个RedisTemplate,设置RedisConnectionFactory属性为spring-boot-autoconfigure的JedisConnectionConfiguration/LettuceConnectionConfiguration自动注册的RedisConnectionFactory,并设置序列化器为StringRedisSerializer。
* 其实也可以直接在主启动类中使用@Autowired注入SpringBoot自动注册的RedisTemplate,并添加一个@PostConstruct的方法来修改它的序列化器为StringRedisSerializer。
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory)
{
final RedisTemplate template = new RedisTemplate<>();
// 设置ConnectionFactory,SpringBoot会自动注册ConnectionFactory-Bean
template.setConnectionFactory(redisConnectionFactory);
// 设置序列化器为StringRedisSerializer(默认是 JdkSerializationRedisSerializer , java操作时会产生乱码)
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(stringRedisSerializer);
template.setValueSerializer(new JdkSerializationRedisSerializer());
template.afterPropertiesSet();
return template;
}
/**
* 配置StringRedisTemplate
* @param factory
* @return
*/
@Bean
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory factory) {
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
针对redis支持的数据类型,可以定制成工具类:
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
@Component
public class RedisUtil
{
@Autowired
private RedisTemplate redisTemplate;
// =============================common============================
/**
* 指定缓存失效时间
* @param key 键
* @param time 时间(秒)
* @return
*/
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(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)
* @return
*/
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)
* @return
*/
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
* @return 值
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
* @param key 键
* @return 对应的多个键值
*/
public Map
写一个测试类,如下:
import com.tw.tsm.base.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
@RequestMapping("/redis")
public class RedisTestController
{
@Autowired
private RedisUtil redisUtil;
@GetMapping("/set")
public void testSet(@RequestParam("key") String key, @RequestParam("val") String val)
{
redisUtil.set(key, val);
}
@GetMapping("/get")
public String testGet(@RequestParam("key") String key)
{
return (String)redisUtil.get(key);
}
}