nosql介绍
NoSQL和SQL数据库的比较
redis简介
1. 速度快
2. 持久化
3. 支持多种数据类型
衍生类型:
4. 备份
主从复制——主服务器的数据可同步到从服务器:为高可用和分布式提供很好的基础。
5. 高可用和分布式
缓存系统 :
计数器 : 提供 incr命令,可在单线程下进行非常高效的计数,且不会出现计数错误的问题。适用于微博评论,转发计数,这种场景。
消息队列系统 : rabitmq…
排行榜 : 提供有序集合
社交网络 : 天然吻合
实时系统:消息队列缓冲…位图:垃圾邮件处理,实时过滤…
在Linux系统中,redis的配置信息在
学习目标:知道编码设计的目的
redis 源码内部有个RedisObject: 包含两个重要的属性
单车道的高速公路
每个瞬间只允许一辆车通过
单线程速度还快的原因:
对于redis来说,所有的 key都是字符串, value可以是多种类型。
字符串: 本质上都是二进制,not Up to 512MB (其实数据大了对单线程不利,考虑到并发和流量,一般都建议在100k内)
场景:
命令:
当字符串中存储的数据为’123‘这种类型时,还可以使用以下API:
set、setnx、setxx
set key value : 无论key是否存在 o(1)
setnx : key不存在
setxx :key必须存在
mget 、mset
批量、原子操作 o(n)
优:可省去网络时间,注意使用mget也要有节制。
getset
getset key newvalue # 设置新值,并返回旧值o(1)
append
append key value # 追加value
strlen
strlen key # 返回字符串长度 (注意中文长度:utf8下一个汉字俩字节)
key | field | value |
---|---|---|
user | name | xyx |
age | 18 | |
gender | man |
Mapmap
Small redis
field不能相同,value可以相同。
hget 、hset、hdel
hget key field
hgetall key # 获取所有属性
hexists 、hlen
hexists # 判断hash键是否有field
hlen # 获取hash key field的数量
hmset、hmget
hmset key field1 value1 field2 value2 field3 value3…
hmget key field1 field2 field3…
应用:
记录网站每个用户个人主页的访问量
hincrby user1 pageview count
缓存视频基本信息(数据在mysql)
hgetall、hvals、hkeys o(n)
hgetall key # 获取key所有的field 和value.(小心使用,返回所有的field和value)
hvals key # 获取key所有的值
hkeys # 获取所有的field
符合关系型数据库的特点。
key | elements |
---|---|
列表:有序、可重复、索引取值
增
rpush key value1 value2 …valueN # 从右往左插
rpush list 1,2,3,4,5
lpush
lpush list1 a,b,c,d
linsert :
linsert key before|after value newvalue # 在list指定值前后插入
linsert list before 1 a
删
lpop # 从左边弹出一个元素。
lpop list------>2,3,4,5
rpop # 右边弹
lrem # 删除指定元素
lrem key count value # 删除列表中count个值为value的元素。count:zheng’fu
a c a c b f
lrem list 0 a # 把list中所有为a的元素都删点
lren list -1 c # 从右开始删除,一个
ltrim
ltrim key start end # 按照索引范围修剪列表
改:lset
lset key index newvalue
查:
lrange # 按照范围取
lrange key start end (闭区间)
lindex # 按照索引取
lindex key index
注意点:
微博timeline:
weibo更新时间轴 | |
---|---|
weibo6 | |
weibo5 | |
weibo4 | |
weibo3 | 微博对象3 |
weibo2 | 微博对象2 |
weibo1 | 微博对象1 |
when 关注的人更新了微博 -------lpush
blpop、brpop
blpop # lpop阻塞版本,timeout阻塞超时时间,timeout=0永不阻塞。
127.0.0.1:6379> blpop a 10
(nil)
(10.07s)
127.0.0.1:6379> lpush a 1 2 3
(integer) 3
127.0.0.1:6379> blpop a 10
1) "a"
2) "3"
127.0.0.1:6379> blpop a 10
1) "a"
2) "2"
127.0.0.1:6379> blpop a 10
1) "a"
2) "1"
TIPS:
user1_like
特点:
sadd 、 srem
sadd : 添加失败返回结果为0
sadd key element
srem key element
scard、sismember、srandmenber、smembers
smembers
-无序
srandmember 和spop
应用:
集合间的API
sdiff 、sinter、 sunion
应用:共同关注
key | score | value |
---|---|---|
user | 1 | like |
100 | name | |
100 | gender |
zadd key score element o(n)
zadd user 1 name 2 age 3 gender 4 id
zrem key element # 可以是多个element
zrem user name age
zscore key element
zincrby key increScore element
zrank # 查看排名
zrem
zrange key start end
zremrangebyrank # 按排名删除范围
zremrangebyrank key start end
zremrangebyscore # 按分值删除
应用:排行榜
慢查询发生在第3 阶段
客户端超时不一定有慢查询
流水线:
将一批命令批量打包,在服务端进行一个批量计算,最后一次性返回。
总时间 = 一次网络时间 + n次命令时间
notes:
3. 注意每次pipline携带数据量
4. pipline每次只能作用在一个redis节点上
5. M操作与pipline区别
角色
API
其它API:
消息队列:
redis本身不提供消息队列,而是通过列表实现。
消息队列与发布订阅的区别在于:消息队列中的资源只用一个客户端获得。而发布订阅消息是所有订阅者均能获得。
位图:
set hello big
getbit hello 0 # b的二进制存储的一个bit
setbit
setbit key offset value # offset 偏移量,即将key的第offset位设为value。—原本的value肯定会改变。
返回结果:之前对应位的值。
setbit hello 0 1 # 将hello的第1位设为1
getbit
getbit key offset
bitcount
bitcount key [start end] # 返回指定范围值为1 的个数
bitop
bitop op destkey key [key…]
做多个Bitmap 的and(交集)、or(并集)、not,并将操作的结果保存到destkey中。
bitpos
bitpos key targetBit[start] [end]
计算位图指定范围第一个 偏移量对应的值等于targetBit的位置
使用:独立用户统计
使用经验:
新的数据结构?
极小空间完成独立用户统计。——算法
type hyperloglog_key ——string
三个命令
pfadd key element [element] # 添加独立用户
pfcount key [key…] # 统计独立用户
pfmerge destkey sourcekey [key…] #
内存消耗
什么是持久化?
redis 数据存储在内存中,会将更新数据异步保存到磁盘。
持久化的方式:
redis -------->命令---------->RDB文件(二进制、硬盘)
重启(恢复redis)------------------>载入RDB文件
生成RDB
save(同步):该命令执行完前,其它命令处于等待状态。——数据量大时会造成redis阻塞。
文件策略——新替老
复杂度o(n)
bgsave(异步):单独线程执行,立即返回ok.
bgsave -->fork()子进程---->createRDB----->告诉redis bgsave successfully
因为fork()快,极少情况下会出现慢的情况阻塞redis
此时可正常访问redis-cli
对比:
自动
自动生成RDB的策略
在的多长时间内,改变了多少条数据------>内部执行bgsave
配置 | seconds | changes |
---|---|---|
save | 900 | 1 |
save | 90 | 10 |
save | 60 | 1000 |
900s 改了1条数据,90s改了10条数据,60s改了1000条数据,都执行bgsave.
——并不是很好的策略,因为数据写入量不受控制,所以生成的规则也不好控制。频繁的操作会对硬盘造成一定压力。
最佳配置:
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir ,/
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes #是否采用校验和
文件名:dump.rdb
默认保存:dir ./
RDB总结
RDB问题:
耗时、耗性能
不可控、数据丢失
解决RDB数据丢失问题。——日志,记录每次操作命令。
redis宕机---->重启之后将AOF载入数据库。
目的:
自动触发时机
改善fork
1. cpu
2. 内存
3. 硬盘
若在一台机器上部署redis节点
总:
redis-server redis-6379.config : 指定配置文件启动
redis-cli
info replication : 查看主从信息。
127.0.0.1:6379> info replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
从:
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:
master_port:6379
master_link_status:up
master_last_io_seconds_age:3
slave_repl_offset:43
slave-read-only:1
connected_slaves:0
.....
127.0.0.1:6380>