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