前言:
当存在海量用户与高并发问题时,关系型数据库会出现性能瓶颈(磁盘IO性能低下) 、扩展瓶颈(数据关系复杂,扩展性差,不便于大规模集群)。mysql数据库数据存放在磁盘,cpu读取磁盘数据慢,读取内存数据速度更快。对于开发环境来说,大部分数据存放在mysql,少部分热点数据存放内存。
**Nosql非关系型数据库:**作为关系型数据库的补充,对数据没有硬性的结构规定。
特征:可扩容、可伸缩,大数据量下高性能,灵活的数据模型, 高可用
常见:Hbase、Redis、 memcache、MongoDB
概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
数据间没有必然的关联关系内部采用单线程机制进行工作高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。多数据类型支持: ◆ 字符串类型 string ◆ 列表类型 list ◆ 散列类型 hash ◆ 集合类型 set ◆ 有序集合类型 zset/sorted_set支持持久化,可以进行数据灾难恢复添加/修改单个数据 :set key value 多个数据:mset key1 value1 key2 value2 …
获取数据:get key 多个数据:mget key1 key2 …
删除数据 :del key
判定性添加数据: setnx key value
获取数据字符个数(字符串长度):strlen key
追加信息到原始信息后部(如果原始信息存在就追加,否则新建):append key value
设置数值数据增加指定范围的值
incr key/ incrby key increment/ incrbyfloat key increment
设置数值数据减少指定范围的值
decr key/ decrby key increment
设置数据具有指定的生命周期
setex key seconds value/ psetex key milliseconds value
添加/修改单个数据 :hset key field value 多个数据:hmset key field1 value1 field2 value2 …
获取数据:hget key field/ hgetall key 多个数据:hmget key field1 field2 …
删除数据 :hdel key field1 [field2]
设置field的值,如果该field存在则不做任何操作:hsetnx key field value
获取哈希表中字段的数量:hlen key
获取哈希表中是否存在指定的字段:hexists key field
添加/修改数据
lpush key value1 [value2] ……
rpush key value1 [value2] ……
获取数据
lrange key start stop
lindex key index
llen key
获取并移除数据
lpop key
rpop key
移除指定数据:lrem key count value
规定时间内获取并移除数据:
blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout
添加数据
sadd key member1 [member2]
获取全部数据
smembers key
删除数据
srem key member1 [member2]
获取集合数据总量
scard key
判断集合中是否包含指定数据
sismember key member
随机获取集合中指定数量的数据
srandmember key [count]
随机获取集合中的某个数据并将该数据移出集合
spop key [count]
求两个集合的交、并、差集
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: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
查询key:keys pattern
* 匹配任意数量的任意符号 ? 配合一个任意符号 [] 匹配一个指定符号
keys *查询所有keys it*查询所有以it开头keys *heima查询所有以heima结尾keys ??heima查询所有前面两个字符任意,后面以heima结尾keys user:?查询所有以user:开头,最后一个字符任意keys u[st]er:1查询所有以u开头,以er:1结尾,中间包含一个字母,s或t什么是持久化:利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化 持久化用于防止数据的意外丢失,确保数据安全性
目的: 防止数据丢失对数据进行备份(磁盘)实现方式 直接拷贝内存中的数据保存到磁盘(RDB)记录用户的操作日志(AOF)使用
修改配置文件dbfilename 指定存储备份文件名称,默认存储位置在dir
daemonize yes port 6379 dir ./data #logfile "logfilr.log" dbfilename "mydump.rdb"执行save指令
bgsave(background save)
save指令执行时会阻塞redis的进程bgsave会创建子进程去执行备份操作,而不会阻塞redis配置频率:设置自动持久化的条件,满足限定时间范围内key的变化数量达到指定数量即进行持久化
save 秒(监控时间范围) 次数(监控key的变化量)
底层任然使用的bgsave指令
daemonize yes port 6379 dir ./data #logfile "logfilr.log" dbfilename "mydump.rdb" save 30 1应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复。
宕机带来的数据丢失风险,RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
大数据量下的IO性能较低
bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能
Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象
概念:AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的。与RDB相比可以简单理解为由记录数据改为记录数据产生的变化,AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式
使用步骤
修改配置文件
appendonly yes|no
appendfilename “append.aof”
appendfsync always|everysec|no(默认为everysec)
daemonize yes port 6379 dir ./data #logfile "logfilr.log" dbfilename "mydump.rdb" save 30 1 appendonly yes appendfilename "append.aof" appendfsync everysec随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重 写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结 果转化成最终结果数据对应的指令进行记录。
目的:去掉没有意义的指令记录,降低磁盘占用量,提高磁盘利用率 ;提高持久化效率,降低持久化写时间,提高IO性能 ;降低数据恢复用时,提高数据恢复效率
实现方式:
手动: bgrewriteaof, 压缩aof文件
自动:
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percentage
对数据非常敏感,建议使用默认的AOF持久化方案
AOF持久化策略使用everysecond,每秒钟fsync一次。该策略redis仍可以保持很好的处理性能,当出 现问题时,最多丢失0-1秒内的数据。注意:由于AOF文件存储体积较大,且恢复速度较慢数据呈现阶段有效性,建议使用RDB持久化方案
数据可以良好的做到阶段内无丢失(该阶段是开发者或运维人员手工维护的),且恢复速度较快,阶段 点数据恢复通常采用RDB方案注意:利用RDB实现紧凑的数据持久化会使Redis降的很低,慎重总结:综合比对
RDB与AOF的选择实际上是在做一种权衡,每种都有利有弊
如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用AOF
如能承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选用RDB
灾难恢复选用RDB
双保险策略,同时开启 RDB 和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据的量
启动服务器——参数启动
redis-server [–port port]
范例
redis-server --port 6379启动服务器——配置文件启动
redis-server config_file_name
范例
redis-server redis.conf启动客户端
redis-cli [-h host] [-p port]
范例
redis-cli –h 61.129.65.248 –p 6384创建配置文件储存目录:mkdir conf
创建服务器文件储存目录(包含日志、数据、临时配置文件等):mkdir data
创建快速访问链接:ln -s redis-5.0.0 redis
设置服务器以守护进程的方式运行,开启后服务器控制台中将打印服务器运行信息(同日志内容相同):daemonize yes|no
绑定主机地址:bind ip
设置服务器端口号:port port
设置服务器文件保存地址:dir path
简介: Jedis用于Java语言连接redis服务,并提供对应的操作API
准备工作:
jar包导入
下载地址:https://mvnrepository.com/artifact/redis.clients/jedis
基于maven
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>◆ 导入坐标
◆ 创建连接
◆ 数据操作
◆ 关闭连接
连接redis
Jedis jedis = new Jedis("localhost", 6379);操作redis
jedis.set("name", "itheima"); jedis.get("name");关闭redis连接
jedis.close(); API文档:http://xetorthio.github.io/jedis/JedisPool:Jedis提供的连接池技术
poolConfig:连接池配置对象
host:redis服务地址
port:redis服务端口号
public JedisPool(GenericObjectPoolConfig poolConfig, String host, int port) { this(poolConfig, host, port, 2000, (String)null, 0, (String)null); }jedis.properties
jedis.host=192.168.40.130 jedis.port=6379 jedis.maxTotal=50 jedis.maxIdle=10静态代码块初始化资源
static{ //读取配置文件 获得参数值 ResourceBundle rb = ResourceBundle.getBundle("jedis"); host = rb.getString("jedis.host"); port = Integer.parseInt(rb.getString("jedis.port")); maxTotal = Integer.parseInt(rb.getString("jedis.maxTotal")); maxIdle = Integer.parseInt(rb.getString("jedis.maxIdle")); poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(maxTotal); poolConfig.setMaxIdle(maxIdle); jedisPool = new JedisPool(poolConfig,host,port); }对外访问接口,提供jedis连接对象,连接从连接池获取
public static Jedis getJedis(){ Jedis jedis = jedisPool.getResource(); return jedis; }复制: crtl + insert
粘贴:shift + insert
edisPoolConfig(); poolConfig.setMaxTotal(maxTotal); poolConfig.setMaxIdle(maxIdle); jedisPool = new JedisPool(poolConfig,host,port); }
##### 获取连接 对外访问接口,提供jedis连接对象,连接从连接池获取 ```java public static Jedis getJedis(){ Jedis jedis = jedisPool.getResource(); return jedis; }复制: crtl + insert
粘贴:shift + insert
