Redis 简介

NoSQL

NoSQL: 即Not-Only SQL(泛指非关系型的数据库), 作为关系型数据库的补充.

作用: 应对基于海量用户和海量数据前提下的数据处理问题.

特征

  • 可扩容, 可伸缩
  • 大数据量下高性能
  • 灵活的数据模型
  • 高可用

类NoSQL数据库:

  • Redis
  • memcache
  • HBase
  • MongoDB

Redis安装与配置

wget https://github.com/redis/redis/archive/7.0.0.tar.gz
mkdir -p /opt
mv 7.0.0.tar.gz /opt/redis.tar.gz
cd /opt
tar -xzvf redis.tar.gz
cd redis
make

redis.conf

# 需要创建data
dir /opt/redis/data
#默认端口6379
port 6379
#绑定ip,如果是内网可以直接绑定 127.0.0.1, 或者忽略, 0.0.0.0是外网
bind 0.0.0.0
#守护进程启动
daemonize yes
#超时
timeout 300
loglevel notice
#分区
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
#存储文件
dbfilename dump.rdb
#密码 abcd123
requirepass abcd123

/etc/systemd/system/redis.service, ExecStart与安装目录保持一致

[Unit]
Description=Redis7
After=redis7.service

[Service]
Type=forking
ExecStart=/opt/redis/src/redis-server /opt/redis/redis.conf 
ExecStop=/opt/redis/src/redis-cli shutdown
ExecReload=/bin/kill -s HUP $MAINPID
PrivateTmp=true
RestartSec=10
# The UNIX user and group to execute PostgreSQL as

[Install]
WantedBy=multi-user.target

启动

systemctl daemon-reload
systemctl start redis
systemctl stop redis

Redis的数据类型

String

  • 存储的数据: 单个数据,最简单的数据存储类型, 也是最常用的数据存储类型
  • 存储数据的格式: 一个存储空间保存一个数据
  • 存储内容: 通常使用字符串, 如果字符串以整数的形式展示, 可以作为数字操作使用

基本操作

# 添加/修改数据
set key value
# 获取数据
get key
# 删除数据
del key
# 判定性添加数据
setnx key value

# 添加/修改多个数据
mset key1 value1 key2 value2 ...
# 获取多个数据
mget key1 key2 ...
获取数据字符个数
strlen key
追加信息到原始信息后部(如果原始信息存在就追加, 否则新建)
append key value

String 类型数据的扩展操作

# 设置数值数据增加指定范围的值
incr key
incrby key increment
incrbyfloat key increment

# 设置数值数据减少指定小范围的值
decr key
decrby key increment

# 设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value

hash类型

  • 新的存储需求: 对一系列存储的数据进行编组, 方便管理, 典型应用存储对象信息
  • 需要的存储结构: 一个存储空间保存多个键值对数据
  • hash类型: 底层使用哈希表学习方式去实现数据存储
# 添加/修改数据
hset key field value

# 获取数据
hget key field
hgetall key

# 删除数据
hdel key field1 [field2]

# 设置field值, 如果该field存在则不做任何操作
hsetnx key field value

# 添加/修改多个数据
hmset key field1 value1 field2 value2 ...

# 获取多个数据
hmget key field1 field2 ...

# 获取哈希表中字段的数量
hlen key

# 获取哈希表中是否存在指定的字段
hexists key field

hash类型数据扩展操作

# 获取哈希表中所有的字段名或字段值
hkeys key
hvals key

# 设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment

List 双链结构

# 从左存入
lpush list1 zs ls ww zl

# 查询从start到end索引的数据
lrange list1 0 3
lrange list1 0 -1

# 从左移除一个
lpop list1

# 长度
llen list1

# 索引获取
lindex list1 1

list 扩展操作

# 先锋队指定数据
lrem key count value

# 规定时间内获取并移除数据, 过了拿不以则返回null
blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout

set

# 添加数据
sadd key member1 [member2]

# 获取全部数据
smembers key

# 删除数据
srem key member1 [member2]

# 获取集合数据数量
scard key

# 判断集合中是否包含指定数据
sismember key member

# 随机获取集合中指定数量的数据
srandmember key [count]

# 随机获取集合中某个数据并将该数据移出集合
spop key [count]

Set类型数据的扩展操作

# 求两个集合的交, 并, 差集
sinter key1 [key2 ...]
sunion key1 [key2 ...]
sdiff key1 [key2 ...]

# 求两个集合的交,并,差集并存储到指定集合中
sinterstore destination key1 [key2 ...]
sunionstore destination key1 [key2 ...]
sdiffstore destination key1 [key2 ...]

# 将指定数据从原始集合中移动到目标集合中
smove source destination member

key 基本操作

# 删除指定key
del key

# 获取key是否存在
exists key

# 获取key的类型
type key

# 排序
sort

# 改名
rename key newkey
renamenx key newkey

# 为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp

# 获取key的有效时间
ttl key
pttl key

# 切换key从时效性黑的为永久性
persist key

# 查询scan, keys会阻塞不再推荐
SCAN cursor [MATCH pattern] [COUNT count]

scan 0 MATCH list* COUNT 5
keys pattern

# MATCH模式规则
# * 匹配什么问题数量的什么任意符号 ? 配合一个任意符号  []匹配一个指定符号

*         查询所有
hh*       查询所有以hh开头
*hh       查询所有以hh结尾
??hh      查询所有前面两个字符什么任意, 后面以hh结尾
user:?    查询所有以user:开头,最后一个字符任意
u[st]er:1 查询以u开头,以er:1结尾,中间饮食一个字母,s或t

db 基本操作

# 切换数据库
select index

# 其他操作, 测试连通
ping

# 清空当前库
flushdb

# 清空所有库
flushall

# 选择库
select

# 移动
move

# 查询库内存储个数
dbsize

Jedis

package util;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ResourceBundle;

public class JedisUtils {

    private static int maxTotal;
    private static int maxIdle;
    private static String HOST;
    private static int PORT;
    private static JedisPoolConfig jedisPoolConfig;
    private static  JedisPool jedisPool;
    static {
        ResourceBundle bundle = ResourceBundle.getBundle("redis");
        maxTotal = Integer.parseInt( bundle.getString("redis.maxTotal"));
        maxIdle = Integer.parseInt( bundle.getString("redis.maxIdel"));
        HOST = bundle.getString("redis.host");
        PORT = Integer.parseInt( bundle.getString("redis.port"));

        jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(maxTotal);
        jedisPoolConfig.setMaxIdle(maxIdle);

        jedisPool = new JedisPool(jedisPoolConfig,HOST,PORT);
    }
    public static Jedis getJedis(){

        return jedisPool.getResource();
    }
}
import redis.clients.jedis.Jedis;
import util.JedisUtils;

import java.util.List;

public class Test {
    public static void main(String[] args) {

        Jedis jedis = JedisUtils.getJedis();

        jedis.auth("password");

        jedis.set("str2","Mark");

        jedis.sadd("set1","a","B","CC");
        long longst1 = jedis.scard("set1");
        System.out.println(longst1);

        jedis.lpush("list1","ab","bc","cd","aa");
        List<String> list1 = jedis.lrange("list1", 0, -1);
        System.out.println(list1.toString());

        String str1 = jedis.get("str1");

        System.out.println(str1);

        jedis.close();
    }
}

redis.properties

redis.maxTotal=50
redis.maxIdel=10
redis.host=127.0.0.1
redis.port=6379 ```

RDB

bgsave 启动子进程进行保存, 优于save的阻塞保存方式

sava 2 10, 10秒内2次数据变化保存, sava配置在后台执行的bgsave操作

  • 会对数据产生影响
  • 真正产生了影响, delete不算
  • 不进行数据比对, set s1 2, set s1 3算2次

AOF 记录操作内容

appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec