前言
这边主要说下5种类型的数据结构,以及基本的使用语法、如何持久化、使用场景。
正文
概念: redis是一款高性能的NOSQL系列的非关系型数据库
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1) 字符串类型 string
2) 哈希类型 hash
3) 列表类型 list
4) 集合类型 set
5) 有序集合类型 sortedset
下载安装
1. 官网:https://redis.io
2. 中文网:http://www.redis.net.cn/
3. 解压直接可以使用:
- redis.windows.conf:配置文件
- redis-cli.exe:redis的客户端
- redis-server.exe:redis服务器端
五种数据结构在idea中的使用演示
/**
* 五种数据结构
* 1,String,get,set,getAll
* 2, Hset,类似于HashMap,hset,hget,hgetAll
* 3, List,lpop,lpush,rpush,rpop,zrange 0 -1
* 4, set,add rem zmembers
* 5, zset,add rem zrange 0 -1
*/
public class Test1 {
// 这个JedisUnit是我自己写的一个工具类,主要依赖的jar包是jedis,
//还依赖commons-pool2这个jar包,大家可以去官网上下载
private static final Jedis jedisPool = JedisUnit.getJedisPool();
public static void main(String[] args) {
stringRedis();
System.out.println("=======");
hsetRedis();
System.out.println("=====");
listRedis();
System.out.println("=====");
setRedis();
System.out.println("=====");
zsortRedis();
}
// 这个就是最简单的String类型,一对键值
public static void stringRedis() {
jedisPool.set("user","zhangsan");
jedisPool.getSet("age","18");
System.out.println(jedisPool.get("user"));
}
// 这个类似于java中的hashmap,传参的时候指定传到哪个map集合,然后写上一对键值
// 也就是一个entry
public static void hsetRedis() {
jedisPool.hset("hmap","user","zhangsan");
jedisPool.hset("hmap","age","18");
System.out.println(jedisPool.hget("hmap","user"));// 获取hashmap中指定的键所对应的值
Map<String, String> hmap = jedisPool.hgetAll("hmap");// 获取hashmap中所有的元素
Set<Map.Entry<String, String>> entries = hmap.entrySet();
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
// 这个就是简单的list集合,不过在这里表现成了队列,可以首尾加数据,出数据
// 指定一个list名称,然后直接写元素,list集合嘛
public static void listRedis() {
jedisPool.lpush("mylist","AA","BB","CC");
jedisPool.rpush("mylist","aa","cc");
System.out.println(jedisPool.lrange("mylist",0,-1));
jedisPool.lpop("mylist");
System.out.println(jedisPool.lindex("mylist",3));
}
/* set集合,无序,所以也没有索引可以操作,注意这个集合获取所有元素不再是range这个
词语,而是members,然后添加是add
*/
public static void setRedis() {
jedisPool.sadd("myset","AA","BB","CC");
Set<String> myset = jedisPool.smembers("myset");
System.out.println(myset);
}
/*
这个类似于LinkedHashSet,是一个按照你传参传进去的分数进行排序的一个集合。
至于zrange和zrangeWithScores的区别,两者的返回值不同,前者只是返回一个
元素类型的set集合,能用set集合相应的方法,后者返回的是Tuple类型的集合,至于
这个是什么我也没去查,但是这个类型的集合可以返回前面一个集合没有的element
以及每个element的score,而原本的set集合的方法它是没有的。
*/
public static void zsortRedis() {
jedisPool.zadd("hero",50,"yasuo");
jedisPool.zadd("hero",80,"leesin");
System.out.println(jedisPool.zrange("hero",0,-1));
Set<Tuple> tuples = jedisPool.zrangeWithScores("hero", 0, -1);
for (Tuple tuple : tuples) {
System.out.println(tuple.getElement()+" "+tuple.getScore());
}
}
}
持久化
-
redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
-
redis持久化机制:
-
RDB:默认方式,不需要进行配置,默认就使用这种机制在一定的间隔时间中,检测key的变化情况,然后持久化数据
1. 编辑redis.windwos.conf文件 -
after 900 sec (15 min) if at least 1 key changed
- save 900 1
-
after 300 sec (5 min) if at least 10 keys changed
- save 300 10
-
after 60 sec if at least 10000 keys changed
- save 60 10000
- 重新启动redis服务器,并指定配置文件名称
D:\redis-2.8.9>redis-server.exe redis.windows.conf
- AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
编辑redis.windwos.conf文件
- appendonly no(关闭aof) --> appendonly yes (开启aof)
- appendfsync always : 每一次操作都进行持久化
- appendfsync everysec : 每隔一秒进行一次持久化
- appendfsync no : 不进行持久化
怎么使用
一般来说,你可以给页面上那些经常被请求但是更新较少的元素使用缓存,比如说一个电商网站的分类,你觉得这些分类会经常改吗?不会。所以我给你说下大体的思路,当一个页面打开,发起了很多的请求,其中一条请求是准备这个分类元素的渲染的,我后台接收到了这个请求,然后走两个判断。1. 如果缓存中没有,我就去查询数据库,查询完数据库返回的数据,我返回给页面用户模板引擎的渲染,同时我还将其写到缓存中,这样下次查找缓存就有数据了;2. 如果缓存有,就直接返回,这样响应速度也快,也省的占用连接数据库的资源。
当然了,redis这个技术还有很多知识点,都是些高级的知识点,现在面试好像必问redis了,这些方面网上也有很多经典的面试题,有些问题、场景的解决方案,提及到redis是必须要会的,比如如何保证数据库和缓存的一致性,这些我有时间也会去多多学习。