一、快速入门
(一)简介
Redis是一个基于内存的key-value结构数据库。
- 基于内存存储,读写性能高
- 适合存储热点数据(短时间大量用户来访问读取的数据)
- 存储的value类型丰富(下面要说的数据类型)
- 结构化的NoSQL
- NoSQL:非关系型数据库(没有表的概念,用键值对存储;数据和数据之间没有联系),非关系型用于对关系型数据的补充
Redis应用场景
- 缓存
- 消息队列
- 任务队列
- 分布式锁
(二)下载与安装
Windows下载地址
Linux下载地址
5.0以上windows下载
(1)Linux安装
tar -zxvf 包名 -C /usr/local
- Redis依赖环境gcc
yum install gcc-c++
cd /usr/local/redis-4.0.0
,然后编译make
- 进入redis的src目录,进行安装
make install
(三)启动与停止服务
(1)Linux下
- 进入redis的src目录,执行
./redis-server
- 后台启动Redis,修改配置文件(redis根目录下)
vim redis.conf
将daemonize no
修改为daemonize yes
- 目前在redis根目录,执行
src/redis-server ./redis.conf
- 默认无密码登录,如需要设置密码,在配置文件
requirepass 密码
将此行取消注释
之后连接Redis后,使用auth 密码
登录 - 连接远程Redis
src/redis-cli -h 地址 -p 6379 -a 密码
- redis默认拒绝远程连接,需修改配置文件,将
bind 127.0.0.1
注释起来(默认没注释)
(2)Windows下
redis-server.exe表示服务端
redis-cli.exe表示客户端
Windows下修改了配置文件,需要cmd命令启动指定配置文件.\redis-server.exe .\redis.windows.conf
二、数据类型
Redis存储的是key-value结构数据,其中key是字符串类型,value有5种常用数据类型。
三、常用命令
(1)字符串String
SET key value
设置指定key的值,eg:set name zhangsan
GET key
根据key获取值SETEX key seconds value
设置指定key的值,并将key的过期时间设置为seconds秒(这个key-value多久过期)SETNX key value
只有key不存在时设置key的value(即当key有对应value后,不允许再被修改,常用于分布式锁)
(2)哈希Hash
(3)列表List
(4)集合Set
(5)有序集合Sorted Set
(6)通用命令
四、Java操作Redis
(一)介绍
(二)Jedis
(三)Spring Data Redis
-
导入坐标
-
配置文件 (注意:password: ”123456“,密码要用双引号括起来)
-
RedisConfig,用于修改Spring data redis默认的序列化方式
RedisTemplate和StringRedisTemplate的区别
A. 在java中使用RedisTemplate操作Redis时,所有的键值对都会在Redis上进行序列化和反序列化(比如set “name” “hhh”,name就会变为"\34\32\0x\name"这种序列化内容,在Redis的客户端get name时就get不到),其实全在java中操作数据,这种序列化也不影响(因为get时会反序列化),只是在Redis客户端get不到。
B. 对于上面这个问题,有如下两种解决办法
C. 第一种,使用StringRedisTemplate,直接自动装配即可
D. 第二种,使用RedisTemplate,然后提供一个RedisConfig,内容如下所示
//RedisConfig
/**
* 修改Spring Data Redis默认的序列化方式
*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//默认的key序列化器为:JdkSerializationRedisSerializer,我们修改为StringRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}
(1)String方法
/**
* String
*/
@Test
public void testString() {
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("name", "zhangsan");
valueOperations.get("name");
}
(2)Hash方法
/**
* Hash
*/
@Test
public void testHash() {
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("001", "name", "zhangsan");
hashOperations.put("001", "age", "19");
String name = (String) hashOperations.get("001", "name");
//获取所有key
Set keys = hashOperations.keys("001");
//获取所有value
List values = hashOperations.values("001");
}
(3)List方法
/**
* List
*/
@Test
public void testList() {
ListOperations listOperations = redisTemplate.opsForList();
//left表示左边,即插入到列表头部
listOperations.leftPush("list", "a");
//一次性插入多个
listOperations.leftPushAll("list", "a", "b", "c");
//取值
listOperations.range("list", 0, -1);
//获取列表长度,对应命令LLEN key
listOperations.size("list");
}
(4)Set方法
/**
* Set
*/
@Test
public void testSet() {
SetOperations setOperations = redisTemplate.opsForSet();
//存值
setOperations.add("set", "a", "b", "c", "d");
//取值
Set set = setOperations.members("set");
//删除
setOperations.remove("set", "a", "c");
}
(5)Sorted Set方法
/**
* Sorted Set
*/
@Test
public void testSortedSet() {
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//存值
zSetOperations.add("ss", "a", 10.0);
zSetOperations.add("ss", "b", 9.0);
zSetOperations.add("ss", "c", 8.0);
//取值
Set<String> ss = zSetOperations.range("ss", 0, -1);
//修改分数,b+1
zSetOperations.incrementScore("ss", "b", 1.0);
//删除
zSetOperations.remove("ss", "a", "b");
}
(6)通用方法
/**
* 通用方法
*/
@Test
public void testCommon() {
//查看所有Key
redisTemplate.keys("*");
//目标key是否存在
redisTemplate.hasKey("keyName");
//key值的类型
redisTemplate.type("keyName");
//key TTL时间
redisTemplate.getExpire("keyName");
//删除key
redisTemplate.delete("keyName");
}
五、Redis进阶
(一)Redis缓存更新策略
主动更新的实现方式:
总结: