Redis随笔
redis
存储结构
- 字符类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合
- 数据缓存(商品数据、新闻、热点数据)
- 单点登录
- 秒杀、抢购
- 网站访问排名…
- 应用的模块开发
redis的应用场景
redis的安装
下载地址:http://download.redis.io/releases
- 下载redis安装包
- tar -zxvf 安装包
- 在redis目录下 执行 make
- 可以通过make test测试编译状态(可以省略)
- make install [prefix=/path]完成安装
启动停止redis
./redis-server ../redis.conf
./redis-cli shutdown
以后台进程的方式启动,修改redis.conf daemonize =yes
连接到redis的命令
./redis-cli -h 127.0.0.1 -p 6379
官网学习:https://redis.io/commands
各种数据结构的使用
字符类型
一个字符类型的key默认存储的最大容量是512M
赋值和取值
SET key value
GET key
递增数字
incr key
incryby key increment 递增指定的整数
decr key 原子递减
append key value 向指定的key追加字符串
strlen key 获得key对应的value的长度
mget key key.. 同时获得多个key的value
mset key value key value key value …
setnx
列表类型
list, 可以存储一个有序的字符串列表
LPUSH/RPUSH: 从左边或者右边push数据
LPUSH/RPUSH key value value …
llen num 获得列表的长度
lrange key start stop ; 索引可以是负数, -1表示最右边的第一个元素
lrem key count value 删除,count表示几个,value表示值
lset key index value
LPOP/RPOP : 取数据
应用场景:可以用来做分布式消息队列
散列类型
hash key value 不支持数据类型的嵌套
比较适合存储对象
person
age 18
sex 男
name mic
..
hset key field value
hget key filed
hmset key filed value [filed value …] 一次性设置多个值
hmget key field field … 一次性获得多个值
hgetall key 获得hash的所有信息,包括key和value
hexists key field 判断字段是否存在。 存在返回1. 不存在返回0
hincryby
hsetnx
hdel key field [field …] 删除一个或者多个字段
集合类型
set 跟list 不一样的点。 集合类型不能存在重复的数据。而且是无序的
sadd key member [member ...] 增加数据; 如果value已经存在,则会忽略存在的值,并且返回成功加入的元素的数量
srem key member 删除元素
smembers key 获得所有数据
有序集合
zadd key score member
zrange key start stop [withscores] 去获得元素。 withscores是可以获得元素的分数
如果两个元素的score是相同的话,那么根据(0<9<A<Z<a<z) 方式从小到大
网站访问的前10名。
expire key seconds
ttl 获得key的过期时间
redis的事务处理
MULTI 去开启事务
EXEC 去执行事务
集群部署
master、slave模式
配置过程
修改redis.conf配置文件
注释bind
修改protected-mode改为no
修改daemonize 为yes
以128问master修改72.129的redis.conf文件,增加slaveof masterip masterport
slaveof 192.168.72.128 6379
- 在redis里执行info replication查看主机信息
- 测试
Lua在linux中的安装
Lua语法:
变量:a=1;print(a);
逻辑表达式,+ - * /
关系运算符:a==b 不等于 -= return boolean
逻辑运算符
and /or
字符连接 ..
If ? then
elseif ? then
else
while ?Do
end
for i=1,100,10 (可以加步长) do
End
数组
x = {'a','b'}
for i,v in ipairs(x) do print(v) end
函数
function(params)
end
Function add (a,b)
Return a+b;
End
Print(add(1,2))
Redis 调用lua命令
通过lua脚本写限制访问次数
--p进行限制,一分钟10次
local num = redis.call('incr',KEYS[1])
if tonumber(num) ==1 then
redis.call('expire',KEYS[1],ARGV[1])
return 1
elseif tonumber(num)> tonumber(ARGV[2]) then
return 0
else
return 1
end
分布式锁
SESSION共享
4G现有方案
或者重写tomcat写session机制,写到redis里
Redis和数据库如何保证一致性?
先更新数据库,更新成功后吧缓存失效
更新数据的时候,先更新缓存,不更新数据库,然后异步去同步到数据库
缓存击穿
Key设置的时间,在某个时间都失效,所有的查询都进入数据,那么就造成数据库压力过大
解决:设置互斥锁,key不存在就设置个锁去数据库取然后缓存到redis,后续的查询方法都等待。
缓存穿透(不存在的key去进行查询,导致数据库瞬时压力比较大,导致数据down机)
查询,redis---》db,首先查询redis,如果没有就会查db
解决方案:1.每次过来的key,如果redis没有就去查数据库,但是redis存储一个规则值,设置一下超时时间,比较短,然后防止下次再过来查询数据库
2.布隆过滤器
缓存失效
失效时间问题
Redis持久化
RDB 快照 可以看下dump.rdb
Rdb持久化策略:定时会吧内存的数据同步到磁盘
触发rdb:
默认规则:
Save 900 1 表示900秒内大于1次 change操作
Save/bgsave
save 执行数据同步,会阻塞redis客户端请求
Bgsave 执行数据同步,不会阻塞redis客户端请求
Flushall 清除内存所有数据,只要有规则存在,redis就执行操作
复制的时候
快照实现原理:
Redis会使用fork函数,复制当前进程的副本。
优缺点:
缺点:可能会存在数据丢失的情况,一个快照执行后,下个快照还没有执行,redis挂了
优点:不影响redis性能,因为有fork子进程去处理
AOF 重写原理
Aof持久化策略:每次执行命令后吧命令追加到磁盘中记录下来,因为有磁盘io读写,会对性能有一点的影响
开启aof
Appendonly yes
两种可以同时使用也可以使用其中一种,同时使用的时候redis会优先使用aof
同步到数据磁盘
每次redis修改数据后,aof会记录操作命令记录到aof文件,由于操作系统的缓存机制,数据并没有实时写到磁盘上,而是进入到磁盘缓存中,再根据磁盘缓存机制定时去更新到磁盘
# appendfsync always 每次执行写入都会进行同步 , 这个是最安全但是是效率比较低的方式
appendfsync everysec 每一秒执行
# appendfsync no 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式
redis
存储结构
- 字符类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合
- 数据缓存(商品数据、新闻、热点数据)
- 单点登录
- 秒杀、抢购
- 网站访问排名…
- 应用的模块开发
redis的应用场景
redis的安装
下载地址:http://download.redis.io/releases
- 下载redis安装包
- tar -zxvf 安装包
- 在redis目录下 执行 make
- 可以通过make test测试编译状态(可以省略)
- make install [prefix=/path]完成安装
启动停止redis
./redis-server ../redis.conf
./redis-cli shutdown
以后台进程的方式启动,修改redis.conf daemonize =yes
连接到redis的命令
./redis-cli -h 127.0.0.1 -p 6379
官网学习:https://redis.io/commands
各种数据结构的使用
字符类型
一个字符类型的key默认存储的最大容量是512M
赋值和取值
SET key value
GET key
递增数字
incr key
incryby key increment 递增指定的整数
decr key 原子递减
append key value 向指定的key追加字符串
strlen key 获得key对应的value的长度
mget key key.. 同时获得多个key的value
mset key value key value key value …
setnx
列表类型
list, 可以存储一个有序的字符串列表
LPUSH/RPUSH: 从左边或者右边push数据
LPUSH/RPUSH key value value …
llen num 获得列表的长度
lrange key start stop ; 索引可以是负数, -1表示最右边的第一个元素
lrem key count value 删除,count表示几个,value表示值
lset key index value
LPOP/RPOP : 取数据
应用场景:可以用来做分布式消息队列
散列类型
hash key value 不支持数据类型的嵌套
比较适合存储对象
person
age 18
sex 男
name mic
..
hset key field value
hget key filed
hmset key filed value [filed value …] 一次性设置多个值
hmget key field field … 一次性获得多个值
hgetall key 获得hash的所有信息,包括key和value
hexists key field 判断字段是否存在。 存在返回1. 不存在返回0
hincryby
hsetnx
hdel key field [field …] 删除一个或者多个字段
集合类型
set 跟list 不一样的点。 集合类型不能存在重复的数据。而且是无序的
sadd key member [member ...] 增加数据; 如果value已经存在,则会忽略存在的值,并且返回成功加入的元素的数量
srem key member 删除元素
smembers key 获得所有数据
有序集合
zadd key score member
zrange key start stop [withscores] 去获得元素。 withscores是可以获得元素的分数
如果两个元素的score是相同的话,那么根据(0<9<A<Z<a<z) 方式从小到大
网站访问的前10名。
expire key seconds
ttl 获得key的过期时间
redis的事务处理
MULTI 去开启事务
EXEC 去执行事务
集群部署
master、slave模式
配置过程
修改redis.conf配置文件
注释bind
修改protected-mode改为no
修改daemonize 为yes
以128问master修改72.129的redis.conf文件,增加slaveof masterip masterport
slaveof 192.168.72.128 6379
- 在redis里执行info replication查看主机信息
- 测试
Lua在linux中的安装
Lua语法:
变量:a=1;print(a);
逻辑表达式,+ - * /
关系运算符:a==b 不等于 -= return boolean
逻辑运算符
and /or
字符连接 ..
If ? then
elseif ? then
else
while ?Do
end
for i=1,100,10 (可以加步长) do
End
数组
x = {'a','b'}
for i,v in ipairs(x) do print(v) end
函数
function(params)
end
Function add (a,b)
Return a+b;
End
Print(add(1,2))
Redis 调用lua命令
通过lua脚本写限制访问次数
--p进行限制,一分钟10次
local num = redis.call('incr',KEYS[1])
if tonumber(num) ==1 then
redis.call('expire',KEYS[1],ARGV[1])
return 1
elseif tonumber(num)> tonumber(ARGV[2]) then
return 0
else
return 1
end
分布式锁
SESSION共享
4G现有方案
或者重写tomcat写session机制,写到redis里
Redis和数据库如何保证一致性?
先更新数据库,更新成功后吧缓存失效
更新数据的时候,先更新缓存,不更新数据库,然后异步去同步到数据库
缓存击穿
Key设置的时间,在某个时间都失效,所有的查询都进入数据,那么就造成数据库压力过大
解决:设置互斥锁,key不存在就设置个锁去数据库取然后缓存到redis,后续的查询方法都等待。
缓存穿透(不存在的key去进行查询,导致数据库瞬时压力比较大,导致数据down机)
查询,redis---》db,首先查询redis,如果没有就会查db
解决方案:1.每次过来的key,如果redis没有就去查数据库,但是redis存储一个规则值,设置一下超时时间,比较短,然后防止下次再过来查询数据库
2.布隆过滤器
缓存失效
失效时间问题
Redis持久化
RDB 快照 可以看下dump.rdb
Rdb持久化策略:定时会吧内存的数据同步到磁盘
触发rdb:
默认规则:
Save 900 1 表示900秒内大于1次 change操作
Save/bgsave
save 执行数据同步,会阻塞redis客户端请求
Bgsave 执行数据同步,不会阻塞redis客户端请求
Flushall 清除内存所有数据,只要有规则存在,redis就执行操作
复制的时候
快照实现原理:
Redis会使用fork函数,复制当前进程的副本。
优缺点:
缺点:可能会存在数据丢失的情况,一个快照执行后,下个快照还没有执行,redis挂了
优点:不影响redis性能,因为有fork子进程去处理
AOF 重写原理
Aof持久化策略:每次执行命令后吧命令追加到磁盘中记录下来,因为有磁盘io读写,会对性能有一点的影响
开启aof
Appendonly yes
两种可以同时使用也可以使用其中一种,同时使用的时候redis会优先使用aof
同步到数据磁盘
每次redis修改数据后,aof会记录操作命令记录到aof文件,由于操作系统的缓存机制,数据并没有实时写到磁盘上,而是进入到磁盘缓存中,再根据磁盘缓存机制定时去更新到磁盘
# appendfsync always 每次执行写入都会进行同步 , 这个是最安全但是是效率比较低的方式
appendfsync everysec 每一秒执行
# appendfsync no 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式
posted on 2017-12-21 16:25 huangjj369 阅读(185) 评论(0) 收藏 举报
浙公网安备 33010602011771号