慕课网Redis入门
1.NoSQL的概述
NoSQL: Not only SQL 非关系型数据库
作用:
解决高并发读写(数据库读写操作频繁)
解决海量数据的高效率存储和访问
解决高可扩展性和高可用性
NoSQL数据库的四大分类:
键值存储、列存储、文档数据库(MongoDB 查询性能不高)、图形数据库
NoSQL的特点:
易扩展
灵活的数据模型
大数据量,高性能的存储
高可用
2.Redis的概述:
高性能的键值对数据库,支持的键值数据类型:
字符串类型,散列类型,列表类型,集合类型,有序集合类型
Redis的应用场景:
缓存 任务队列 网站访问的统计 数据过期的处理
分布式集群架构中的session分离
3.Redis的安装
搭建环境:
虚拟机、Linux系统、SSH客户端(SecureCRT7.3,SecureFX 7.3)
Redis Windows:
Jedis:redis 连接的基本操作
jedis介绍:支持多种语言 Jedis是redis官方首选的java客户端开发包
Jedis的使用:在项目中导入jedis的jar包 导入
代码使用方法:
//1.初始化 设置IP地址和端口
Jedis jedis=new Jedis(“192.168.32.130”,6379);
//1.保存数据
jedis.set(“name”,:“imooc”);
//2.获取数据
String str=jedis.get(“name”);
System.out.println(str);
//3.释放资源
jedis.close();
使用连接池的方式连接
//1.获得连接池的配置对象
JedisPoolConfig config=new JedisPoolConfig();
//2.设置最大连接数
config.setMaxTotal(30);
//3.设置最大空闲连接数
config.setMaxIdle(10);
//4.获取连接池
JedisPool jedisPool =new JedisPool(config,“192.168.30.132”,6379);
//5.获得核心对象:
Jedis jedis =null;
try{
//通过连接池获得连接
jedis =jedisPool.getSource();
//设置数据
jedis.set(“name”,“Tom”);
//获取数据
String value=jedis.get(“name”);
System.out.println(value);
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
if(jedis !=null){
jedis.close();
}
if(jedisPool!=null){
jedisPool.close();
}
}
Redis的数据结构:
1.字符串(String)
2.哈希(hash)
3.字符串列表(list)
3.字符串合集(set)
4.有序字符串集合(sorted set)
key定义注意点: 不要过长、 不要过短 、有统一的命名规范
一、存储String的常用命令:
1.赋值: set “key” “value” 如: set name jack
2.取值: get “key” 如:get name
3.获取值 设定值: getset “key” “value”
4.删除 : del “key”
5.数值的增减: incr num :若num无初始值,将初始值设为0 再加一,如果num为非Integer型的值 则报错; 减: decr num 若有初始值 则减一
6.以规定的数值加减:incrby decrby
如: incrby num 3 decrby num 5
7.向数字后面拼凑字符串 在已存在的字符串后面加上值 如: append num 5
此时若num的值是3,append num 5后为:“35” 若num无初值 则该操作为将num赋值为后面的值
二、存储Hash:
String Key 和String value 的容器 适合存储对象等键值对的数据
存储哈希的常用命令:
1.存储: hset myhash username jack
hset myhash age 18
存储key的多个值:
hset myhash2 username rose age 21
2.获取:hget myhash username 获取key的一个值
hmget myhash username age 获取key 的多个值
hgetall myhash 获取key的所有值
3.删除:hdel myhash username age 删除key的多个值
4.增加:hincrby myhash age 5 (增加数字) ----> age=25
5.判断是否存在:hexists myhash username 返回1 则存在
6.获取属性的长度: hlen mybash
7.获取所有的key:hkeys mybash
8.获取所有的values: hvalues mybash
三、存储List
四、存储set
五、存储sorted set…
Redis 的keys通用操作
1.keys * 所有的keys
2.keys my?: 查询所有的my开头的key
3.del my1 my2 my3 :删除多个key
4.exists my1 判断是否存在my1
5.rename company newcompany 重命名一个key
6.type newcompany:返回key的类型 如:String ,List ,Hash等
Redis的特性
速度快 持久化 多种数据结构 支持多种编辑语言 功能丰富 简单 主从复制(主服务器以及从服务器 主服务器数据可以同步到从服务器上) 高可用、分布式
16个数据库 多数据库
1.select 选择数据库 :select 1
2.move “key” 1:将"key" 移动到1号数据库
3.事务处理:
使用multi exec discard 处理事务
①multi: 开启事务 后面的执行命令都会被放在后面执行命令队列里面 未提交之前其他操作不可 访问 multi开启—>操作
②exec:相当于commit()提交操作
③discard: 在multi后 如果未提交 使用discard 将执行事务回滚
特性:多数据库、事务
Redis的持久化
定义:把数据从内存上同步到硬盘上
持久化的方式(缓存机制):
RDB持久化:
在指定的时间内将内存中的快照及数据写入到磁盘
AOF持久化:
以日志的方式记录服务器的操作
无持久化
RDB持久化和AOF持久化相结合
RDB方式:定时备份(利于文件备份):
优势:灾难恢复 性能最大化(开始持久化时,唯一做的是分叉出一些进程,通过进程实现持久化) 定时持久化
缺点:在定时持久化之前服务器宕机出错 利用子进程协助如果数据集大时需要停止服务器一段时间 在最大限度避免数据的丢失情况下不适用
配置:打开vim redis.conf,在该配置文件的一百多行左右出现如下配置
900秒 至少一个key发生变化 保存一个快照 持久化一次
300秒 至少10个key发生变化 保存快照
600秒 至少有10000key发生变化 保存快照
AOF方式:
优势一:带来更高的数据安全性
方案:①每秒同步(异步,高效率,若在这一秒中服务器宕机了这一秒保存的数据就直接丢失了)、
②每修改同步(同步持久化,每发生数据变化硬盘中的数据都会立即发生变化,缺点是效率低但安全性高)
采用append方式(追加),对数据库之前的数据不会产生影响
③不同步
优势二:AOF包含一个格式清晰,便于理解的日志文件用于记录所有的修改操作,根据这个文件完成数据重建,便于操作
区别:AOF运行效率低于RDB
AOF配置: 打开redis.conf(vim redis.conf)
将redis.conf文件里面的appendonly no 变为 appendonly yes,此时会生成一个文件appendonly.aof
同步策略的改变:
之后 停掉redis ./bin/redis-cli shutdown
重启redis:
若执行了flashall操作(清空数据库),可以关闭redis后打开appendonly.aof文件找到flushall操作,将flushall操作删除。删除掉过后重连客户端之前的删除的操作就又恢复了。
Redis的典型应用场景:
缓存系统 (cache和storage)
计数器
消息队列系统
排行榜
社交网络
实时系统
一.Redis的安装:
安装后的文件、工具:
redis-server: redis服务器
redis-cli: redis命令行客户端
redis-benchmark: 对redis做一些基准测试
redis-check-aof: AOF文件修复工具
redis-check-dump: RDB文件检查工具
二.Redis三种启动方法:
最简启动
动态参数启动(修改参数启动)
配置文件启动方式(文件存储参数启动)
三.Redis常用配置:
(Redis默认端口:6379)
daemonize:是否是守护进程
port:redis对外端口号
logfile:redis系统日志
dir:Redis工作目录
四.Redis的通用命令
通用命令:keys(见上,一般不在生产环境中使用)
del key [key …] (删除key)
dbsize(对所有键值信息的统计)
expire key second(设置key在second秒过后过期)
persist key(去掉key的过期时间)
ttl key(查看到过期时还剩的剩余时间)
exists key(查看key是否存在)
type key(返回key的类型------>String ,Hash,List,sorted set,set)
注:Redis使用的是单线程 一次执行一条命令 实际上,Redis并不是单线程
五.Redis中的数据结构---->字符串(对上面内容的补充)
1.字符串键值对结构 key-value
注:value可以是二进制 大小限制在512M
2.应用场景:缓存 计数器 分布式锁等等
3.使用的一些操作命令:
①incr、decr、incrby、decrby(见上)
incrbyfloat getrange setrange(字符串的浮点数的增加,以及设定范围的修改)
②set key value
#不管key是否存在,都设置
③setnx key value
#key不存在,才设置(相当于添加)
④set key value xx
#key存在,才设置(相当于更新)
⑤mget和mset
mget key1,key2,key3 批量获取key 原子操作
mset Key1,key2 批量设置key
⑥getset strlen
getset key newvalue
#set key newvalue并返回旧的value
append key value
#将value追加到旧的value
strlen key
#返回value的长度
六.Redis中的数据结构---->哈希
哈希的键值对结构:key filed(属性) value(值)
user name Damon
操作见上
其他的一些命令:
hgetall key
#返回hash key对应的所有的field和value
hvals key
#返回hash key对应所有的field的value
hkeys key
#返回hash key对应的所有的field
七.Redis中的数据结构---->列表(List)
特点:有序 可以重复 左右两边可以弹出插入
结构:key elements
user:1:message a b c d e f g h i j k l m
API:
rpush:从列表的右端插入值(1-N个)
eg: rpush listkey a b c
lpush: 从列表的左端插入值(1-N)
eg: lpush listkey c b a
linsert:在list指定的值前后插入newValue
eg: linsert key before|after value newValue
lpop:从列表左侧弹出一个item(删除)
eg:lpop listkey
rpop:从列表右侧弹出一个item(删除)
eg:rpop listkey
lrem:根据count值从列表删除所有value相等的项
eg:lrem key count value
ltrim:按照索引范围修剪列表
eg:ltrim listkey start end
lrange:获取列表指定索引范围内所有的item
eg:lrange key start end(包含end)
lindex:获取列表指定索引的index
eg:lindex listkey 4
llen:获取列表的长度
eg: llen key
lset:设置列表指定索引值为newValue
eg: lset listkey value newValue
八.Redis中的数据结构---->集合(set)
结构: key values
类似于高中的集合(不能有重复元素)
sadd srem:向集合key添加element(如果存在则添加失败)
eg:sadd key element
srem key element:将集合中key中的element移除掉
eg:srem key element
scard:计算集合大小
eg: scard key
sismember:判断value是否在集合中
eg:sismember key value =1
srandmember:从集合中随机挑count个元素
eg:srandmember key count=his
spop:从集合中随机弹出一个元素
eg:spop key=sports
smembers:获取集合中的所有元素(注:返回元素是无序的)
eg:smembers key
sdiff:差集
eg: sdiff user:1:follow user:2:follow
sinter:交集
eg:sinter user:1:follow user:2:follow
sunion:并集
eg:sunion user:1:follow user:2:follow
九.Redis中的数据结构---->有序集合(Zset)
key (score element)
user:ranking 95 kris
特点:有序 value为score和element两项 无重复元素
zadd:添加score和element
eg:zadd key score element(可以是多对)
zrem:删除元素
eg:zrem key element(可以是多个)
zscore:返回元素的分数
eg:zscore key element
zincrby:增加或减少元素的分数
eg:zincrby key increScore element
zcard:返回元素的总个数
eg:zcard key
zrank:返回元素的分数排名
eg:zrank key element
zrange:返回指定索引范围内的升序元素[分值]
eg:zrange key start end [WITHSCORES]
十.Redis中的慢查询(slowlog):
慢查询生命周期:
说明:慢查询发生在第三阶段 客户端超时不一定慢查询,但慢查询是客户端超时的一个原因
两个配置:1.slowlog-max-len
先进先出队列
固定长度(slowlog的长度)
保存在内存内
2.slowlog-log-slower-than
慢查询阈值(单位:微秒)
slowlog-log-slower-than=0,记录所有命令
slowlog-log-slower-than<0,不记录任何命令
3.配置方法
。。。
慢查询的命令:1.slowlog get[n]:获取慢查询队列
2.slowlog len:获取慢查询队列的长度
3.slowlogreset:清空慢查询队列
运维经验:
slowlog-max-len不要设置过大 ,默认10ms,通常设置1ms
slow-log-slower-than不要设置过小,通常设置在1000左右
定期持久化慢查询
理解命令的生命周期
十一.Redis的流水线(pipeline)
n次事件=n次网络时间+n次命令时间
1次pipeline(n条命令)=1次网络时间+n次命令时间
使用建议:
1.注意每次pipiline携带的数据量
2.pipeline每次只能作用在一个redis节点上
3.M操作与pipeline的区别
十二.Redis的发布订阅功能
角色:发布者 订阅者 频道
模型:
注:在实现发布订阅功能时,在发布者发布消息后订阅者再订阅则不能看到之前的消息
API:publish
演示:redis>publish sohu:tv “hello world”
subscribe
演示:redis> subscribe sohu:tv
unsubscribe
演示:redis>unsubscribe sohu:tv
十三.Redis的主从复制
1.一主一从
redis有master节点(主节点)和slave节点(从节点)
主从复制达到了一个备份的功能,避免服务器宕机出现的问题
2.一主多从
总结:
1.一个master可以有多个slave
2.一个slave只能有一个master
3.数据流是单向的,master到slave