Redis随笔

redis

存储结构

  1. 字符类型
  2. 散列类型
  3. 列表类型
  4. 集合类型
  5. 有序集合
  6. 数据缓存(商品数据、新闻、热点数据)
  7. 单点登录
  8. 秒杀、抢购
  9. 网站访问排名
  10. 应用的模块开发

redis的应用场景

redis的安装

下载地址:http://download.redis.io/releases

  1. 下载redis安装包
  2. tar -zxvf 安装包
  3. redis目录下 执行 make
  4. 可以通过make test测试编译状态(可以省略)
  5. 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.129redis.conf文件,增加slaveof masterip masterport

slaveof 192.168.72.128 6379

 

  1. redis里执行info  replication查看主机信息
  2. 测试

 

 

 

 

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现有方案

或者重写tomcatsession机制,写到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秒内大于1change操作

       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

存储结构

  1. 字符类型
  2. 散列类型
  3. 列表类型
  4. 集合类型
  5. 有序集合
  6. 数据缓存(商品数据、新闻、热点数据)
  7. 单点登录
  8. 秒杀、抢购
  9. 网站访问排名
  10. 应用的模块开发

redis的应用场景

redis的安装

下载地址:http://download.redis.io/releases

  1. 下载redis安装包
  2. tar -zxvf 安装包
  3. redis目录下 执行 make
  4. 可以通过make test测试编译状态(可以省略)
  5. 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.129redis.conf文件,增加slaveof masterip masterport

slaveof 192.168.72.128 6379

 

  1. redis里执行info  replication查看主机信息
  2. 测试

 

 

 

 

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现有方案

或者重写tomcatsession机制,写到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秒内大于1change操作

       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)    收藏  举报