前言

这边主要说下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());
        }
    }
}

持久化

  1. redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
  2. 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
  1. 重新启动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是必须要会的,比如如何保证数据库和缓存的一致性,这些我有时间也会去多多学习。