(1)概念
是一款高性能的nosql系列的菲关系型数据库
菲关系型数据库特点
- 数据之间没有关联关系
- 数据存储在内存中
一般情况将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
应用场景
- 缓存
- 聊天室在线好友列表
- 任务队列(秒杀,抢购,12306等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
- 分布式集群架构中的Session分离
redis.windows.conf:配置文件
redis-cli.exe:客户端
redis-server.exe:服务器端
数据结构
存储的是:key=value格式的数据,其中key都是字符串,value有五种不同的数据结构
- 字符串类型string
- 哈希类型hash:map格式
- 列表类型list:Linkedlist
- 集合类型set:hashset
- 有序集合类型sortedset
(2)操作
- 字符串类型string
存储:set key value
获取:get key
删除:del key
- 哈希类型hash
存储:hset key field value
获取:hget key field,hgetall key获取所有的
删除:hdel key field
- 列表类型list
是简单的字符串列表,按照插入顺序排序,可以在头部(左边)或尾部(右边)添加一个元素
添加:lpush,rpush key value:从列表的左边或右边添加进去
获取:
lrange key start end:范围的获取
删除:
lpop key:删除列表最左边的元素,并将元素返回
rpop key:删除列表最右边的元素,并将元素返回
- 集合类型set
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
SADD key member1 [member2] 向集合添加一个或多个成员
SCARD key 获取集合的成员数
SPOP key 移除并返回集合中的一个随机元素
SUNION key1 [key2] 返回所有给定集合的并集
存储:sadd key value
获取:smembers key:获取集合中所有元素
删除:srem key value:删除set集合中的某个元素
参考:https://www.redis.net.cn/tutorial/3511.html
- 有序集合类型sortedset
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
存储:zadd key score value:
获取:zrange key start end
查看分数:zrange key start end withscores
删除:zrem key value
通用命令:
keys *:查询所有键
type key: 获取键对应value的类型
del key:删除指定的key value
(3)持久化
redis是一个内存数据库,当redis服务器重启,数据会丢失。可以将redis内存中的数据持久化保存到硬盘中。
持久化机制:
1、RDB:默认方式,不需要进行配置。在一定时间间隔汇总,检测key的变化情况,然后持久化数据到
save 900 1
after 900 sec (15 min) if at least 1 key changed
save 300 10
after 300 sec (5 min) if at least 10 keys changed
save 60 10000
after 60 sec if at least 10000 keys changed
重新启动redis服务器,并指定配置文件的名称
redis-server.ext reids.windows.conf
2、AOF:不推荐使用。日志记录的方式,可以记录每一条命令的操作,每一次命令操作后持久化数据
- 编辑redis.windows.conf文件
- appendonly no(关闭aof)改成yes,开启aof
- # appendfsync always:每一次操作都进行持久化,性能低
appendfsync everysec:每隔一秒操作一次持久化
# appendfsync no:不进行持久化
(3)Java客户端 Jedis
是一款java操作redis数据库的工具
使用步骤:
- 下载Jedis的jar包
- 使用
- //获取连接
- Jedis jedis = new Jedis(“localhost”,6379);
- //操作
- jedis.set("username","zhangshan");
- //关闭连接
- jedis.close()
Jedis操作各种redis中的数据结构
导坐标:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
- 字符串类型string
set/get
//使用空参构造,默认值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
jedis.set("username","zhangsan");
//可以使用setex()方法存储可以指定过期时间的key value
//参数key:任意名称,第二参数:时间,单位是秒,第三参数:值
jedis.setex("activatecode",20,"hehah");
//将activatecode:hehah键值对存入redis,并在20秒后自动删除
System.out.println(jedis.get("username"));
jedis.close();
- 哈希类型hash:map格式
hset/hget
/**
* hash数据结构操作
*/
@Test
public void test2(){
//使用空参构造,默认值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
jedis.hset("user","name","lisi");
jedis.hset("user","age","23");
jedis.hset("user","gender","male");
System.out.println(jedis.hget("user","name"));
//获取hash的所有map数据
Map<String,String> user = jedis.hgetAll("user");
Set<String> keySet = user.keySet();
for (String key:keySet){
System.out.println(key + ":" + user.get(key));
}
jedis.close();
}
- 列表类型list:Linkedlist
lpush/rpush
lpop/rpop
lrange start end:范围获取
/**
* list数据结构操作
*/
@Test
public void test3(){
//使用空参构造,默认值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
jedis.lpush("mylist","a","b","c");
jedis.rpush("mylist","a","b","c");
//获取范围:0 -1:所有的元素
List<String> mylist = jedis.lrange("mylist",0,-1);
System.out.println(mylist);
//list左弹出
String element1 = jedis.lpop("mylist");
System.out.println(element1);
//list右弹出
String element2 = jedis.rpop("mylist");
System.out.println(element2);
//获取范围:0 -1:所有的元素
List<String> mylist2 = jedis.lrange("mylist",0,-1);
System.out.println(mylist2);
jedis.close();
}
- 集合类型set:hashset,不允许重复元素
sadd
smembers
/**
* set数据结构操作
*/
@Test
public void test4(){
//使用空参构造,默认值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
jedis.sadd("myset","java","php","c++");
Set<String > myset = jedis.smembers("myset");
System.out.println(myset);
jedis.close();
}
- 有序集合类型sortedset
zadd
/**
* sortedset数据结构操作
*/
@Test
public void test5(){
//使用空参构造,默认值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);
//score:分数,应用场景:如英雄的出场次数,关注程度等
jedis.zadd("mysortedset",12,"亚瑟");
jedis.zadd("mysortedset",15,"后裔");
jedis.zadd("mysortedset",25,"孙悟空");
Set<String> myset = jedis.zrange("mysortedset",0,-1);
System.out.println(myset);
jedis.close();
}
(4)Jedis连接池:JedisPool
使用
- 创建JedisPool连接池对象
- 调用方法getResource()方法获取连接
/**
* jedis连接池使用
*/
@Test
public void test6(){
//创建配置对象
JedisPoolConfig config = new JedisPoolConfig();
//最大连接数
config.setMaxTotal(50);
//最大空闲连接
config.setMaxIdle(10);
//创建Jedis连接池对象
JedisPool jedisPool = new JedisPool("localhost",6379);
//获取连接
Jedis jedis = jedisPool.getResource();
jedis.set("mylist","hhhh");
System.out.println(jedis.get("mylist"));
//连接归还到连接池中
jedis.close();
}
升级,使用工具类
在src下建:jedis.properties文件
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
/**
* JedisPool工具类
*/
public class JedisPoolUtil {
private static JedisPool jedisPool;
static {
//读取配置文件
InputStream inputStream = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties properties = new Properties();
//关联文件
try{
properties.load(inputStream);
}catch (Exception e){
e.printStackTrace();
}
//获取数据,设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
//初始化JedisPool
jedisPool = new JedisPool(config,
properties.getProperty("host"),
Integer.parseInt(properties.getProperty("port")));
}
public static Jedis getJedis(){
return jedisPool.getResource();
}