0%

Redis学习笔记

NoSQL

NoSQL(Not Only SQL):非关系型数据库。有些数据的数据类型不需要固定的模式,无需多余操作就可以横向扩展。NoSQL无需为事先为要存储的数据建立字段,随时可以存储自定义的数据格式。

  • KV键值对:Redis
  • 文档型数据库:MongoDB
  • 列存储数据库
  • 图关系数据库

分布式数据库的CAP和BASE

概述

  • 一个Redis实例存在16个数据库,默认连接的是0号数据库,使用select num选择连接的数据库。
  • move key db:将某个key移动到某个数据库。
  • ping:返回PONG则连接成功
  • keys pattern
  • del key [key …]
  • exists key [key …]
  • type key
  • dbsize: 查看当前数据库key数量
  • flushdb
  • flushall

数据结构

string

  • set key value [EX seconds] [PX milliseconds] [NX|XX]
  • get key

list

  • 有排序的字符串集合,允许重复元素
  • llen list
  • lpush key value [value …]
  • rpush key value [value …]
  • lrange key start stop (从0开始)
  • lpop key
  • rpop key

set

  • 无排序的字符串集合,不允许重复元素
  • sadd key member [member …]
  • smembers:获取所有元素
  • scard:获取集合中元素个数
  • spop key:随机出栈
  • smove key1 key2 key1中某个值:将key1中某个值移到key2
  • sismember:是否为set中的元素

hash

  • hset key field value
  • hget key field
  • hdel key field [field …]

sorted-set(Zset)

  • zadd key [NX|XX] [CH] [INCR] score member [score member …]

事务

  • multi:开始事务
  • discard:取消事务
  • exec:执行事务
  • watch key [key …]:如果事务开始前这些key被其他命令修改过,那么事务被打断
  • unwatch
  • 正常执行
  • 放弃事务
  • 全体连坐:当某条命令不等执行EXEC便报错,则全部命令放弃执行。
  • 冤头债主:当某条命令在EXEC后才报错,则只会影响它自己的执行。
  • Watch监控:执行了exec或unwatch后所有监控锁都会被清除。

持久化

RDB方式(Redis DataBase)

  • 在指定的时间间隔内将内存中的数据集快照写入磁盘,恢复时直接将快照文件恢复到内存。
  • 保存在dump.rdb文件中。
  • 优势:只有一个文件,时间间隔的数据,可以归档为一个文件,方便压缩转移(就一个文件)
  • 劣势:如果宕机,数据损失比较大,因为它是没一个时间段进行持久化操作的。也就是积攒的数据比较多,一旦懵逼,就彻底懵逼了。另外,fork的时候内存中的数据被克隆了一份,大致两倍的膨胀性。
  • 默认打开。

AOF方式(Append only file)

  • 以日志的形式来记录每个写操作,不记录读操作,只能追加文件而不能修改,redis启动之初会根据日志来恢复。
  • 保存在appendonly.aof文件中。
  • 优势:即使宕机,也不会损失数据,也不会破坏原有日志文件,保证数据的安全性。
  • 劣势:文件比rdb大,效率更低。
  • 在redis.conf文件中,默认关闭。

主从复制,读写分离

  • Master以写为主,Slave以读为主。

  • 哨兵模式:

    1. 6379带着6380和6381
    2. conf文件所在目录下新建sentinel.conf文件(名字不能错)。
    3. 配置哨兵:在sentinel文件中填写:sentinel monitor 被监控数据库名字(自己起) 127.0.0.1 6379 1(1表示主机挂掉以后slave投票决定下一个master是谁)
    4. 启动哨兵:Reids-sentinel …/sentinel.conf。
    5. 若哨兵监控到master挂了,则投票使某个slave成为master(假设是6380),当6379重新启动后,它将成为6380的slave。

集群

Jedis

连接

直接连接:

1
2
3
4
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("name", "刘家东");
System.out.println(jedis.get("name"));
jedis.close();

连接池方式:

1
2
3
4
5
6
7
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(30);
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
Jedis jedis = jedisPool.getResource();
jedis.set("name", "Tom");
System.out.println(jedis.get("name"));
jedis.close();

事务

1
2
3
4
Transaction transaction = jedis.multi();
transaction.set("k1", "11");
transaction.set("k2", "22");
transaction.exec();

主从复制

1
2
3
4
5
6
7
Jedis jedis_M = new Jedis("127.0.0.1",6379);
Jedis jedis_S = new Jedis("127.0.0.1",6380);

jedis_S.slaveof("127.0.0.1",6379);

jedis_M.set("class","1122V2");
String result = jedis_S.get("class");

连接池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class JedisPoolUtil {
private static volatile JedisPool jedisPool = null;
private JedisPoolUtil(){}
public static JedisPool getJedisPoolInstance() {
if(null == jedisPool) {
synchronized (JedisPoolUtil.class) {
if(null == jedisPool) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
//配置一个pool可分配多少个jedis实例,如果复制为-1则表示不限制。
poolConfig.setMaxActive(1000);
//控制一个pool最多有多少个状态为空闲的jedis实例
poolConfig.setMaxIdle(32);
//当borrow一个jedis实例时,最大的等待时间
poolConfig.setMaxWait(100*1000);
//获得一个jedis实例时是否检查连接可用,如果为true,则得到的所有jedis实例都是可用的
poolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379);
}
}
}
return jedisPool;
}

public static void release(JedisPool jedisPool,Jedis jedis) {
if(null != jedis) {
jedisPool.returnResourceObject(jedis);
}
}
}

Redisson

概述

Redisson是架设在Redis基础上的一个Java驻内存数据网格。

Jedis和Redisson对比

  • Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
  • Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。
  • Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
  • Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。
  • Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。
  • 在分布式开发中,Redisson可提供更便捷的方法。