目录
链接: redis中文网
redis是一个基于内存的key-value的结构数据库
特点
基于内存存储,读写性能高
适合存储热点数据(热点商品,资讯,新闻。。。)
主要应用于数据缓存,任务队列,消息队列,分布式锁等
redis的常用基本配置
配置项 示例 说明
daemonize daemonize yes 是否启用后台运行,默认no
port port 6379 设置默认端口号,默认6379
logfile logfile 日志文件 设置日志文件
databases databases 255 设置redis数据库总量
dir dir数据文件目录 设置数据文件存储目录
requirepass requirepass 12345 设置使用密码
redis通用命令
命令 示例 说明
select select 0 选择0号数据库
set set name lily 设置key=name,value=lily
get get hello 获得key=hello结果
keys keys he* 根据patten表达式查询符合条件的key
dbsize dbsize 返回key的总数
exists exists a 检查key=a是否存在
del del a 删除key=a的数据
expire expire hello 20 设置key=hello 20秒后过期
ttl ttl 查看key=a的过期剩余时间
redis数据类型
String 字符串类型
Hash Hash类型
List 列表类型
Set 集合类型
Zset 有序集合类型
字符串命令
get get hello 获得key=hello结果
set set hello world 设置key=hello,value=hello
mset mset hello world java best 一次性设置多个值
mget mget hello hava 一次性获取多个值
del del hello 删除key=hello
incr/decr incr count/decr count key值自增1/自减1
incrby/decrvy incrby count 99/decrvy count 99 Key值自增99/自减99
setex setex <key> <second> <value> 设置定时的值
setnx setnx <key> <value> 当key不存在时,设置value
Hash命令
hget hget emp age 获取hash中key=age的值
hset hset emp age 23 设置hash中age=23
hmset hmset emp age 30 name kaka 同时设置多个hash值
hmget hmget emp age name 同时设置多个hash值
hgetall hgetall emp 获取hash所有值
hdel hdel emp age 删除emp的age
hexists hexists emp name 检查是否存在
hlen hlen emp 获取指定长度
list命令
rpush listkey c b a 右侧插入元素
lpush listkey f e d 左侧插入元素
rpop listkey 右侧删除元素
lpop listkey 左侧删除元素
lrange listkey 0 -1 查询列表中第一个至最后一个元素
set与zset命令
set元素唯一且无序集合
sadd set a 为集合添加元素
smembers set 查看集合元素
sinter set1 set2 查看两个集合的相交结果
sunion set1 set2 查看两个集合的合并结果
sdiff set1 set2 查看set1中有set2中没有的结果
zset元素唯一按序号排序的有序集合
zadd zset 100 a 为集合添加元素
zrange 按序号进行排列输出
使用jedis操作redis数据库代码
jedis的使用方法基本等同于redis命令
package cn.itcast.jedis.test;
import cn.itcast.jedis.util.JedisPoolUtils;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* jedis的测试类
*/
public class JedisTest {
/**
* 快速入门
*/
@Test
public void test1(){
//1. 获取连接
Jedis jedis = new Jedis("localhost",6379);
//2. 操作
jedis.set("username","zhangsan");
//3. 关闭连接
jedis.close();
}
/**
* string 数据结构操作
*/
@Test
public void test2(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
//存储
jedis.set("username","zhangsan");
//获取
String username = jedis.get("username");
System.out.println(username);
//可以使用setex()方法存储可以指定过期时间的 key value
jedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对
//3. 关闭连接
jedis.close();
}
/**
* hash 数据结构操作
*/
@Test
public void test3(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// 存储hash
jedis.hset("user","name","lisi");
jedis.hset("user","age","23");
jedis.hset("user","gender","female");
// 获取hash
String name = jedis.hget("user", "name");
System.out.println(name);
// 获取hash的所有map中的数据
Map<String, String> user = jedis.hgetAll("user");
// keyset
Set<String> keySet = user.keySet();
for (String key : keySet) {
//获取value
String value = user.get(key);
System.out.println(key + ":" + value);
}
//3. 关闭连接
jedis.close();
}
/**
* list 数据结构操作
*/
@Test
public void test4(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// list 存储
jedis.lpush("mylist","a","b","c");//从左边存
jedis.rpush("mylist","a","b","c");//从右边存
// list 范围获取
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
// list 弹出
String element1 = jedis.lpop("mylist");//c
System.out.println(element1);
String element2 = jedis.rpop("mylist");//c
System.out.println(element2);
// list 范围获取
List<String> mylist2 = jedis.lrange("mylist", 0, -1);
System.out.println(mylist2);
//3. 关闭连接
jedis.close();
}
/**
* set 数据结构操作
*/
@Test
public void test5(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// set 存储
jedis.sadd("myset","java","php","c++");
// set 获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
//3. 关闭连接
jedis.close();
}
/**
* sortedset 数据结构操作
*/
@Test
public void test6(){
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// sortedset 存储
jedis.zadd("mysortedset",3,"亚瑟");
jedis.zadd("mysortedset",30,"后裔");
jedis.zadd("mysortedset",55,"孙悟空");
// sortedset 获取
Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
System.out.println(mysortedset);
//3. 关闭连接
jedis.close();
}
/**
* jedis连接池使用
*/
@Test
public void test7(){
//0.创建一个配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
//1.创建Jedis连接池对象
JedisPool jedisPool = new JedisPool(config,"localhost",6379);
//2.获取连接
Jedis jedis = jedisPool.getResource();
//3. 使用
jedis.set("hehe","heihei");
//4. 关闭 归还到连接池中
jedis.close();;
}
/**
* jedis连接池工具类使用
*/
@Test
public void test8(){
//通过连接池工具类获取
Jedis jedis = JedisPoolUtils.getJedis();
//3. 使用
jedis.set("hello","world");
//4. 关闭 归还到连接池中
jedis.close();;
}
}
spring-boot整合redis
spring data redis 提供了一个高度封装的类 : RedisTemplate ,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口:
ValueOperations: 简单的k-V操作
SetOperations:set类型操作
ZSetOperations:
HashOperations:
ListOperations:
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
简单的配置application.yml
spring:
redis:
host: localhost
port: 6379
#password: 密码
database: 0 #操作0号数据库
jedis:
pool:
max-active: 8 #最大连接数
max-wait: 1ms #最大阻塞的等待时间
max-idle: 4 #连接池中的最大空闲连接数
min-idle: 0 #连接池中的最小空闲连接数
设置key序列化器
@Configuration
public class Redisconfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
//修改redis的key的序列化器,默认的key序列化器为:JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}