Redis3.2学习记录

nosqljava

特征:访问量大,高并发,高可用,海量数据linux

redis3.2
做用:减轻关系型数据库查询的压力
安装:
windows下解压便可使用,启动服务如:redis-server redis-config文件
linux下:
软件压缩包在/home/soft/下
tar -zxvf 源码 -C /usr/local/ 解压到/usr/local/下
进入解压目录,使用gcc编译(yum -y install gcc 安装)。生成可执行程序。
make编译,make install(能够不用,主要做用是将redis添加到环境变量中)
进入src中,启动服务:./redis-server,这种方式是前台启动,ctrl+c退出
后台启动 ./redis-server &  (也能够在redis.conf中设置daemonize值为yes)
使用ps查看进程:ps -ef | grep redisredis

启动客户端:./redis-clisql

关闭redis:数据库

1.切换到redis/src/目录下,执行./redis-cli shutdown(比较安全,推荐使用这种方式,主要是先
完成数据的操做,在进行关闭)
2.kill pid 或者kill -9 pid(不推荐)
3.退出redis-cli 可输入exit编程

客户端:
1.命令行客户端,本机直接链接:./redis-cli
指定IP和端口链接:./redis-cli -h 127.0.0.1 -p 6379
2.图形客户端。redis desktop manager(这个工具须要本机有c编译库),远程访问
注意网络访问的安全策略,首先关闭linux的防火墙
centos6.5关闭防火墙命令
1.永久性生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables offvim

2.即时生效,重启后复原
开启: service iptables start
关闭: service iptables stopwindows


第二,修改redis.conf配置文件:(主要是redis有安全保护措施,默认只有本机访问)
bind ip 绑定ip此行注释掉
protected-mode yes 保护模式改成no后端

修改配置文件先作备份:cp redis.conf bak_redis.conf
使用vim 修改,
vim redis.confcentos

在命令模式下使用 /bind ;搜索bind关键字。

注意:修改后,咱们在启动时要指定咱们修改的配置文件
./redis-server ../redis.conf &

查看防火墙:systemctl status firewalld (Active inactive关闭)

有一个java写的客户端工具:redisclient-win32x86_64.2.0.jar(直接使用,不用依赖啥C++类库的
)

编程客户端:Jedis

redis的数据持久化,内部执行


操做基本命令
1.ping 返回PONG,表示当前服务可用
2.dbsize 查看当前数据库中key的数目(默认访问第0个库)
3.select db 切换数据库,如:select 5 表示使用第5 个库
4.flushdb 删除当前库的全部数据
5.exit或quit 退出客户端
操做key命令:
1.keys pattern 查找全部符合模式pattern的key,pattern使用通配符(在生产环境中,
少用*,采用 通配符查找,单线程查找,通配符(*全部、?单个字
符、))
2.exists key [key...] 判断key是否存在 返回整数数量。
3.expire key seconds 设置key的超时时间,若是key不存在,则设置无效,返回值0
4.ttl key 查看key剩余的生存时间(秒为单位),返回值-1:永久存在;-2不存在
;>0的值, 表明剩余生存时间
5.type key 查看key所存储值得数据类型
6.del key [key...] 删除指定的key,不存在的key忽略
操做value命令:

五种数据类型
a.string 包括二进制数据,序列化后的数据,最大512M
b.hash 特别适合用于存储对象(分布式环境中解决session会话不一致,采用redis服务器
进行共享,使用hash存储当前登陆的用户信息)
c.list 简单的字符串列表
d.set 无序集合,惟一,不能重复
e.zset 有序集合,通过排序的集合类型

数据类型操做命令
A.string基本命令:
set,get,
incr(理解成i++,incr key[若是key不存在,则先建立+1] 值加1并返回,原子操做,可用
于全局的计数器)
decr 减一 (在线用户数,登录+1,退出-1)
append key value 追加value,返回追加后的总字符数,若是追加的key不存在,则相对
set
B.string经常使用命令:
  strlen key 长度
  getrange key start end (至关substring(),)
  setrange key offset value 用value覆盖(相等replace()。)
  mset 建立多个key,value
  mget 获取多个key值
A.hash基本命令:
  hset key field value
  hget key field
  hmset key [field.. value..]
  hmget key field[field...]
  hgetall key 获取哈希表key中全部的域和值
  hdel key field[field] 删除key中的field
B.hash经常使用命令:
  hkeys key 获取key中的全部field
  hvals key 获取key中的全部value
  hexists key field 查看给定field是否存在
A.list基本命令:
头部操做:以l开始,尾部操做:以r开始
  lpush key value[value...] 存储顺序和操做顺序相反
  rpush key value[value...] 存储顺序和操做顺序一致
  lrange key start stop 获取列表key中指定区间内的元素,包含start stop
  lindex key index 获取指定下标index的成员
  llen key 获取列表key的长度
B.list经常使用命令:
  lrem key count value 根据参数count的值,删除列表中雨参数value相等的元素,count
>0,从列表的左侧向右侧删除,count <0,则从右向左,count =0,则删除与value相等的全部值,返回
删除元素的个数
  lset key index value 将列表key下标为index的元素的值设置为value
  linsert key BEFORE|ALFTER pivot value 将值value插入到列表key 当中位于值povot之
前或以后的位置
A.set基本命令:
  sadd key member[member...] 添加成员,重复的成员没法添加的
  smembers key 获取集合key中的全部成员元素,key不存在,则返回空集合
  sismember key member 判断当前成员member在当前集合key中是否存在
  scard key 获取集合里面的成员个数
  srem key member[member...] 删除集合key中的一个或多个成员

B.set经常使用命令:
  srandmember key [count] 随机返回集合中一(count)个元素,不删除元素,count默认为1
,count正数,返回的集合元素各不相同,count负数:则容许重复
  spop key [count] 随机从集合中删除一(count)个元素,并返回删除的元素,count默认为1

A.zset基本命令:
  zadd key score member[score member...] 将一个或多个member元素及其score值加入到
有序集合key中,若是member存在集合中,则更新值;socre能够是整数或浮点数
  zrange key start stop[WITHSCORES] 查询有序集合,指定区间的内的元素,默认不带分
数socres
  zrem key member[member...] 删除指定成员的member
  zcard key 统计成员key的个数

B.zset经常使用命令:
  zrangebyscore key min max [withscores] [LIMT offset count] 获取有序集key中,所
有score值介于min和max之间的成员,limit用来限制返回结果的数量和区间,withscores显示score
和value


高级部分:
A.redis事务(与写代码有关系,其余三项服务器设置)
transaction,一组命令的集合,保证至少有两条及以上命令被正常执行。
1.multi 事务的开始标志,当前还未执行命令
2.exec 执行所全部事务块内的命令
3.discard 取消事务
事务的执行过程:首先开启事务multi,其次向事务队列中加入命令,最后执行事务提交exec
redis事务是没有回滚的,只保证性能
4.watch key [key...] 监视当前key是否被其余事务改变
watch机制:主动放弃事务。这种方式避免了资源竞争,解决数据安全问题
对比sql事务中,算是乐观锁机制
5.unwatch key [key...] 取消监视
B.持久化
两种方式:
1.RDB(redis database)方式:在指定时间间隔内将内存中的数据快照写入到磁盘中(默认
是dump.rdb),保存数据是在单独进程中写文件,默认开启的。
实现:redis.conf中配置
  save: 配置执行RDB生成快照文件的时间策略
  dbfilename:设置RDB的文件名,默认文件为dump.rdb
  dir:指定RDB文件的存储位置,默认是./当前目录
优势:因为存储的是数据快照文件,恢复数据很方便,也比较快
缺点:会丢失最后一次快照之后更改的数据。因为常常操做磁盘,RDB会分出一个子进程,
若是redis数据很大,子进程占用比较多的时间。
3.AOF(Append-only File)方式:若是你怕数据丢失,能够采用AOP方式,即redi每次接
收到一条改变数据的命令时,它将把该命令写到一个AOF文件中(只记录写操做,读操做不记录),
当redis重启时,它经过执行AOF文件中全部的命令来恢复数据。
实现:redis.conf中配置
  appendonly:默认是no,改为yes便可开启aof持久化
  appendfilename:指定AOF文件名,默认文件名为appendonly.aof
  dir:指定RDB和AOF文件存放的命令,默认是./
  appendfsync:配置aof文件写命令数据的策略;
    no:不主动进行同步操做,而是彻底交由操做系统来作(即每30s一次),
比较快但不是很安全
    always:每次执行写入都会执行同步,慢一些但比较安全
    everysec:每秒执行一次同步操做,比较平衡,介于速度和安全之间。默
认项
  auto-aof-rewrite-min-size:容许重写的最小AOF文件大小,默认是64M.当文件大
于64M时,开始自动整理aof文件,去掉无用的操做命令。

C.主从复制
高可用的解决方案,集群(一种服务器的网络结构)
1.主从复制--读写分离原则
两种实现方式:1.修改配置文件,启动时,指定主从服务器。(实际开发中使用)
2.命令行中指定master-slave之间的关系。
修改配置文件,分别配置master-slave的conf文件
  master:redis6380.conf
    include /usr/local/redis-3.2.10/redis.conf
    daemonize yes
    port 6380
    pidfile /var/run/redis_6380.pid
    logfile 6380.log
    dbfilename dump6380.rdb
  slave:redis6382.conf
    include /usr/local/redis-3.2.10/redis.conf
    daemonize yes
    port 6382
    pidfile /var/run/redis_6382.pid
    logfile 6382.log
    dbfilename dump6382.rdb
    slaveof 127.0.0.1 6380
  slave:redis6384.conf
    include /usr/local/redis-3.2.10/redis.conf
    daemonize yes
    port 6384
    pidfile /var/run/redis_6384.pid
    logfile 6384.log
    dbfilename dump6384.rdb
    slaveof 127.0.0.1 6380
info replication 查看启动的master-slave信息关系
问题:容灾处理
A.Master6380忽然中止(模拟挂掉)
将slave 6382升级为master,salve 6384新挂载到新master上
命令:slaveof no one表示将当前从服务器升级为master;
slaveof host port改为成新的从服务器slave
B.把忽然挂掉的服务修好了,从新添加到如今的主从关系中。
从新启动6380
执行salveof 127.0.0.1 6382
+++++++++++++++++++上面出了故障,须要人为参与,为使自动,产生哨兵模式++++++++++++
2.高可用Sentine哨兵
    监控--主从服务器是否正常工做
    提醒--经过sentinel会通知管理员或其余应用程序
    自动故障转移--监控的主redis不能正常工做,sentinel会开始进行故障迁移操做
,从新分配主从redis

哨兵:奇数个,至少三个,采起投票方式决定。默认端口26379
哨兵监控主redis,采用心跳机制,ping根据响应结果判断redis运行状态.
哨兵是独立的程序,之间相互独立的
配置哨兵配置文件:
主要修改两个位置:
port 26380
sentinel monitor mymaster 127.0.0.1 6380 2
格式:sentinel monitor <name> <masterIP> <masterPort> <Quorum投票数>

启动哨兵模式后,自动化处理故障的主从关系。

D.安全设置
1.设置密码

2.绑定ip

修改默认端口

E.Jedis操做Redis
redis是单线程,存在线程不安全问题,每每与common-pool一块儿使用,建立链接池。获取
jedis对象进行操做。


F.redis中有关技术问题:
1.缓存穿透:
在高并发条件下,会致使没法从缓存中查询到数据,直接从数据库查询,请求量
过大,这样会致使数据库系统压力很大。这种状况下,就是缓存穿透。
解决方案:
采用多线程方式解决,使用锁或关键字synchronized,双重检测锁进行。
2.缓存雪崩:
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,
会给后端系统带来很大压力。致使系统崩溃。
  1:在缓存失效后,经过加锁或者队列来控制读数据库写缓存的线程数量。好比对
某个key只容许一个线程查询数据和写缓存,其余线程等待。

  2:作二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,能够访问A2,A1缓存
失效时间设置为短时间,A2设置为长期

  3:不一样的key,设置不一样的过时时间,让缓存失效的时间点尽可能均匀。

相关文章
相关标签/搜索