- Redis是一个基于内存的key-value结构数据库。
- 基于内存存储,读写性能高
- 适合存储短时间内大量被访问的数据
- 应用场景:缓存、任务队列、消息队列、分布式锁
启动Redis服务:redis-server,默认端口为6379
霸屏运行,需要复制一个新的标签窗口。
启动客户端: redis-cli
修改配置文件,让Redis服务在后台运行:(Ctrl+C 停掉服务)
该配置文件在Redis的根目录下。
命令后面显示地添加要加载哪个Redis的配置文件(redis.conf)
设置(redis-conf文件中)需要密码并设置密码为123456:
杀掉原来的Redis进程,重新启动服务,启动客户端:
现在只允许本机连接该redis服务,在其他服务器例如Windows中无法连接:
修改配置文件(redis-conf):
注释掉这一行。
结束进程并重启redis,其他服务器就能访问了:(需要关闭6379端口的防火墙)
Windows安装Redis
启动Redis服务:双击redis-server.exe
打开客户端:双击redis-cli.exe
还需要配置环境变量,注册Windows服务
Redis常用数据类型(指的是value的数据类型,key是固定的字符串类型)- 字符串 string 普通字符串,常用
- 哈希 hash 适合存储对象
- 列表 list 按照插入顺序排序,可以有重复元素
- 集合 set 无序集合,没有重复元素
- 有序集合 sorted set 有序集合,没有重复元素
https://www.redis.net.cn
字符串 string 操作命令get返回的值都是“”,都是字符串。
哈希 hash 操作命令列表 list 操作命令
集合 set 操作命令
有序集合 sorted set 操作命令
通用命令
在Java中操作Redis
- Redis的Java客户端:Jedis、Lettuce、Redisson
- Spring中提供:Spring Data Redis
- SpringBoot提供:spring-boot-starter=data-redis
Junit也需要
redis.clients jedis2.8.0
public class JedisTest {
@Test
public void testRedis(){
//1 获取连接
Jedis jedis = new Jedis("localhost",6379);
//2 执行具体的操作
jedis.set("username","xiaoming");
String value = jedis.get("username");
System.out.println(value);
//jedis.del("username");
jedis.hset("myhash","addr","bj");
String hValue = jedis.hget("myhash", "addr");
System.out.println(hValue);
Set keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
//3 关闭连接
jedis.close();
}
}
Spring Data Redis
junit junitorg.springframework.boot spring-boot-starter-data-redis
application.yml
spring:
application:
name: springdataredis_demo
#Redis相关配置
redis:
host: localhost
port: 6379
#password: 123456 (当前本地redis没有设置密码)
database: 0 #操作的是0号数据库,redis默认提供16个数据库
jedis:
#Redis连接池配置
pool:
max-active: 8 #最大连接数
max-wait: 1ms #连接池最大阻塞等待时间
max-idle: 4 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
//设置key的序列化器(value一般不用,程序中get它的时候会自动反序列化获得
@Bean
public RedisTemplate
测试:
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {
//配置文件中写了redis相关配置,springboot就会自动注入这个对象,就可以直接自动装配
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testString(){
redisTemplate.opsForValue().set("city123","beijing");
String value = (String) redisTemplate.opsForValue().get("city123");
System.out.println(value);
redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);
Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
System.out.println(aBoolean);
}
@Test
public void testHash(){
HashOperations hashOperations = redisTemplate.opsForHash();
//存值
hashOperations.put("002","name","xiaoming");
hashOperations.put("002","age","20");
hashOperations.put("002","address","bj");
//取值
String age = (String) hashOperations.get("002", "age");
System.out.println(age);
//获得hash结构中的所有字段
Set keys = hashOperations.keys("002");
for (Object key : keys) {
System.out.println(key);
}
//获得hash结构中的所有值
List values = hashOperations.values("002");
for (Object value : values) {
System.out.println(value);
}
}
@Test
public void testList(){
ListOperations listOperations = redisTemplate.opsForList();
//存值
listOperations.leftPush("mylist","a");
listOperations.leftPushAll("mylist","b","c","d");
//取值
List mylist = listOperations.range("mylist", 0, -1);
for (String value : mylist) {
System.out.println(value);
}
//获得列表长度 llen
Long size = listOperations.size("mylist");
int lSize = size.intValue();
for (int i = 0; i < lSize; i++) {
//出队列
String element = (String) listOperations.rightPop("mylist");
System.out.println(element);
}
}
@Test
public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
//存值
setOperations.add("myset","a","b","c","a");
//取值
Set myset = setOperations.members("myset");
for (String o : myset) {
System.out.println(o);
}
//删除成员
setOperations.remove("myset","a","b");
//取值
myset = setOperations.members("myset");
for (String o : myset) {
System.out.println(o);
}
}
@Test
public void testZset(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//存值
zSetOperations.add("myZset","a",10.0);
zSetOperations.add("myZset","b",11.0);
zSetOperations.add("myZset","c",12.0);
zSetOperations.add("myZset","a",13.0);
//取值
Set myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
//修改分数
zSetOperations.incrementScore("myZset","b",20.0);
//取值
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
//删除成员
zSetOperations.remove("myZset","a","b");
//取值
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
}
@Test
public void testCommon(){
//获取Redis中所有的key
Set keys = redisTemplate.keys("*");
for (String key : keys) {
System.out.println(key);
}
//判断某个key是否存在
Boolean itcast = redisTemplate.hasKey("itcast");
System.out.println(itcast);
//删除指定key
redisTemplate.delete("myZset");
//获取指定key对应的value的数据类型
DataType dataType = redisTemplate.type("myset");
System.out.println(dataType.name());
}
}
Spring Cache可整合Redis,简化操作



