redis是一款高性能的NOSQL系列的非关系型数据库(key-value)

官网:https://redis.io/

中文网:https://www.redis.net.cn/

一、非关系型数据库

1. 特点

  • 数据之间没有关联关系
  • 数据存储在内存中

2. 解决的问题

  • 经常查询的一些不会经常发生变化的数据
    • 缓存思想
      • 若缓存中存在,则直接从缓存数据库中查询数据并返回
      • 若缓存中不存在,则到关系型数据库中查询,将查询到的结果放入缓存并返回

二、Redis数据库

1. 下载

2. 安装

  • 下载zip压缩包,解压即可使用

3. 配置

  • redis.windows.conf:Redis的核心配置文件
  • redis-cli.exe:Redis的客户端
  • redis-server.exe:Redis的服务端

4. 使用

  • 双击redis-server.exe运行服务端
  • 双击redis-cli.exe运行客户端

5. Redis的学习

  • Redis数据结构
    • key-value格式的数据
      • key都是字符串
      • value有5种不同的数据结构
        • 字符串类型:string(String)
        • 哈希类型:hash(map)
        • 列表类型:list(linkedlist)
        • 集合类型:set(无重复值)
        • 有序集合类型:sortedset(有序且无重复值)

6. 字符串类型

  • 存储:set key value
  • 获取:get key
  • 删除:del key

7. 哈希类型

  • 存储:hset key field value
  • 获取:hget key field hgetall key
  • 删除:hdel key field

8. 列表类型(可重复)

  • 可以添加一个元素到列表的头部或者尾部
  • 添加
    • lpush key value:将元素加到列表头部
    • rpush key value:将元素加到列表尾部
  • 获取
    • lrange key start end:获取范围内的列表元素
    • lrange key 0 -1:获取列表中所有元素
  • 删除
    • lpop key:从列表的头部删除元素,并将元素返回
    • rpop key:从列表的尾部删除元素,并将元素返回

9. 集合类型(无重复)

  • 存储:sadd key value
  • 获取:smembers key:获取set集合中所有元素
  • 删除:srem key value:删除set集合中的某个元素

10. 有序集合类型(有序无重复)

  • 每个value对应一个double类型的浮点数,有序集合正是通过这个浮点数保证有序的

  • 存储:zadd key score value

  • 获取:zrange key start end

    • zrange key 0 -1 withscores
  • 删除:zrem key value

11. 通用命令

  • 查询所有的键:key *
  • 查询指定键对应value的类型:type key
  • 删除指定的key-value:del key

12. 持久化

  • 将内存中的数据存储到本地,就叫持久化数据

  • Redis持久化机制

    • RDB:默认方式,不需要配置,默认就使用这种机制
      • 在一定时间间隔中,检测key的变化情况,然后持久化数据
    • AOF:日志记录的方式,可以记录每一条命令的操作,可以在每一次命令操作后,持久化数据
  • 配置文件 redis.windows.conf

    • RDB配置

      • 修改以下配置文件项
      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.exe redis.windows.conf
    • AOF配置

      • 修改以下配置文件项
      appendonly no 
      # 关闭AOF
      appendonly yes
      # 开启AOF
      appendfsync always
      # 每一次操作都进行持久化
      appendfsync everysec
      # 每隔一秒进行一次持久化
      appendfsync no
      # 不进行持久化
      
      • 重新启动Redis,并指定配置文件: redis-server.exe redis.windows.conf

三、Java操作Redis

1. Jedis

  • 导入maven依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>
  • 代码实现
public class JedisDemo1 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost",6379);
        jedis.set("password","123456");
        jedis.close();
    }
}
  • 前往客户端查看 keys *,可以看到password的key和值

2. Jedis操作5种Redis数据结构

  • 操作String类型
public class JedisDemo1 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost",6379);
        //操作String类型(String)
        jedis.set("password","123456");
        //操作哈希类型(HashMap)
        HashMap<String, String> hashmap = new HashMap<String, String>();
        hashmap.put("name","zhangsan");
        hashmap.put("age","69");
        hashmap.put("gender","male");
        jedis.hset("hashmap",hashmap);
        //操作列表类型(list)
        jedis.lpush("listB","a");
        jedis.lpush("listB","b");
        jedis.rpush("listB","c");
        //操作Set集合(set)
        jedis.sadd("set","a");
        jedis.sadd("set","b");
        //操作有序集合(SortedSet)
        jedis.zadd("zset",99,"zhangsan");
        jedis.zadd("zset",69,"lisi");
        jedis.zadd("zset",66,"wangwu");
        jedis.close();
    }
}

3. String类型常用方法

  • setex(String key,int second,String value):增加字符串数据项并指定过期时间
  • set(String key,String value):增加字符串数据项(覆盖,已存在覆盖值)
  • setnx(String key,String value):增加字符串数据项(不覆盖,若已存在则不执行)
  • del(String key):删除指定键的字符串数据项
  • get(String key):获取指定键的字符串数据项的值
  • append(String key,String s):在指定键的字符串数据项的value后追加字符串
  • mset(String key1,String value1,String key2,String value2...):增加多条字符串数据项
  • mget(String key1,String key2...):获取指定键对应的多条数据项

4. Hash类型常用方法

  • hset(String key,String key,String value):增加指定键的hash数据项
  • hset(String key,Map map):增加指定键对应的值加入hash数据项
  • hgetAll(String key):获取指定键对应的hash数据项
  • hkeys(String key):获取指定键对应的hash数据项的所有键
  • hvals(String key):获取指定键对应的hash数据项的所有值
  • hdel(String key,String k1,String k2...):从指定键对应的hash数据项中删除多个元素
  • hlen(String key):获取指定键对应的hash数据项的元素个数
  • hexists(String key,String k1):判断指定键对应的hash数据相中是否存在k1对应的元素

5. List类型常用方法

  • lpush(String key,String v1,String v2...):从list头部插入元素
  • rpush(String key,String v1,String v2...):从list尾部插入元素
  • lrange(String key,int start,int end):获取指定区间的list元素
  • lrem(String key,int n,String value)
  • lpop(String key):从list头部弹出一个元素
  • rpop(String key):从list尾部弹出一个元素
  • llen(String key):获取list的元素个数
  • lset(String key,int index,String value):修改list中指定索引处的值

6. Set类型常用方法

  • sadd(String key,String v1,Stirng v2...):增加指定键对应的set数据项
  • smembers(String key):获取指定键对应的set数据项的所有元素
  • srem(String key,String val):删除set中值为val的数据项
  • srem(String key,String v1,String v2...):删除set中值为v1,v2的数据项、
  • spop(String key):随机弹出set中一个元素
  • scard(String key):获取set集合的元素个数

7. SortedSet类型常用方法

  • zadd(String key,Map map):增加指定件对应的zset数据项
  • zadd(String key,int score,int val):向zset中加入一个元素
  • zrange(String key,int start,int end):获取zset指定区间的元素值
  • zrangeWithScore(String key,int start,int end):获取zset指定区间的元素值和score
  • zrangeByScore(String key,int start,int end)
  • zrem(String key,String vlaue):删除zset例指定值的元素
  • zcard(String key):获取zset中元素的个数

四、Jedis连接池

1. JedisPool

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
config.setMaxWaitMillis(3000);
JedisPool jedisPool = new JedisPool(config,"localhost",6379);
Jedis jedis = jedisPool.getResource();
jedis.set("key","value");
jedis.close();

2. JedisPool工具类

package com.zhiyuan.jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.util.Properties;

public class JedisPoolUtils {
    private static JedisPool jedisPool;
    private JedisPoolUtils(){}
    static{
        Properties pros = new Properties();
        try {
            pros.load(JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties"));
            String host = pros.getProperty("Host");
            String port = pros.getProperty("Port");
            String maxTotal = pros.getProperty("MaxTotal");
            String maxIdle = pros.getProperty("MaxIdle");
            String maxWaitMillis = pros.getProperty("MaxWaitMillis");
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxIdle(Integer.parseInt(maxIdle));
            config.setMaxTotal(Integer.parseInt(maxTotal));
            config.setMaxWaitMillis(Integer.parseInt(maxWaitMillis));
            jedisPool = new JedisPool(config,host, Integer.parseInt(port));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
Host=localhost
Port=6379
MaxTotal=50
MaxIdle=10
MaxWaitMillis=3000

原文作者:絷缘
作者邮箱:zhiyuanworkemail@163.com
原文地址:https://zhiyuandnc.github.io/WvJdcATYk/
版权声明:本文为博主原创文章,转载请注明原文链接作者信息