redis缓存以及集群详解

  1. redis的安装以及启动
  • windows环境
  1. 到官网下载zip的安装包
  2. 如果不安装redis服务就需要启动redis-service.exe可执行文件
  3. 如果不想每次启动就安装redis服务
  4. 安装 :redis-server --service-install --service-name redis2 (redis2是服务的名称)
  5. 安装并指定日志级别: redis-server --service-install redis.windows.conf --service-name redis3 --loglevel verbose(指定配置文件,日志级别)
  6. 安装并指定端口:redis-server --service-install –service-name redisService1 –port 10001
  7. 卸载:redis-server --service-uninstall --service-name redis2
  8. 启动 :redis-server --service-start --service-name redis2 也可以到service.msc中鼠标操作
  • linux环境
  1. http://www.redis.io/下载tar.gz安装包 ,或是在线安装$ wget http://download.redis.io/releases/redis-2.8.3.tar.gz
  2. 解压 tar xzf redis-2.8.3.tar.gz
  3. 到解压的名录下使用 make命令实现编译
  4. 编译完成到安装目录下src目录下使用 make install命令安装文件
  5. 可以把redis配置文件和可执行文件(redis-service、redis-cli)放到比较上层的目录,这样就不需要每次都切换目录了。
  6. 把redis配置文(redis.conf)中 daemonize 设置成yes,实现后台启动redis;修改数据文件保存路劲;
  7. 查看redis端口 ps -ef|grep 6379
  8. 退出redis服务 pkill redis-server ;kill 进程号 ; 路径/redis-cli shutdown(后台启动)/ 前置启动就直接ctrl+c
  1. redis数据类型命令使用详解
  • String
  set  name   value     设置值,多次设置会覆盖 
  get  name              根据name获得value
  del  name           删除值
  setnx (设置值的时候有返回0,设置失败) 设置返回1,设置成功
  setex    (设置时间)   set  name 10 value
  setrange (从第几个位置开始设置值,0开始,并返回长度)
  mset   name value  name2  value2 (批量设置值)  
  mget   name  name1 name2
  incr /decr   age   (对age进行递增或递减,返回执行结果的值)
  incrby /decby  age  [步长](对age增加或减少多少,返回执行1结果的值)
  append  name value  (给name追加value,并返回长度)
  • Hash
 适合保存对象(hset user id 1、hset user name pwade、hset user age 20)此时user就相当于一个对象
 hset  myhash  name value    hget myhash name
 hincr /hdecr  递增递减
 hexists 判断key是否存在,有返回1无返回0
 hlen 返回 hash里所有的键值
 hdel hash name 删除
 hkeys  myhash 得到所有字段
 hmget myhash  name name1 name2 (redis属性名)
 hvals   得到所有value
 hgetall   得到字段和value
  • List
    list 是一个链表结构集合,其主要功能就是push和pop,list类型是双端链表的结构,可以在头部或尾部操作数据,既可以做栈,又可以做队列 
    lpush  从头部添加元素,先进后出(栈)
    rpush  从尾部添加元素  ,先进先出(队列)  
    flushdb 清空数据库 
    lrange list 0 -1 查找list中所有数据 
    linsert 插入元素  
    lrem list 下标位置     返回移除的个数 
    lpop 从头部删除元素,并返回删除元素  
    rpop 从尾部删除元素,并返回删除元素  
    rpoplpush 尾部删除数据,从头部添加数据
    lindex list 1 返回下边为1的元素值 
    llen list  返回元素个数
  • Set 、Zset
set和String的无序集合,是通过hashtable实现的
sadd set1 aaa  添加数据
smembers set1  查看set1里面的数据
srem set1  删除
spop 随机返回删除的key
sdiff  返回两个集合不同的元素
sdiffstore  返回两个集合不同的元素,储存到set3集合里面、
sinter 取交集
sunion 取并集
smove 将一个集合移动但另外一个集合
scard 查看集合里面的元素个数
sismember 是否为集合中的元素,是返回1,否返回0
zadd zset1 5 aaa  向有序集合set1添加一个aa元素,位置下标在5
zrange  zset1 0 -1 withscores
zrem zset1  key 删除元素
zincrby 元素递增或递减
zrangebyscore  返回指定区间内的数据
zremrangebyrank  只删除索引
zremrangebyscore  删除指定序号
zrank  根据从小到 排序
  1. 高级命令
exists key  key是否存在
keys  name*  模糊查询
expire name  time 设置过期时间   ttl name 查看过期时间
persist name 取消过期时间
select   选择数据库(0-15)  select 0
move name [数据库下标] 移动数据到其他数据库
rname name name1 修改name为name1
echo 打印信息
dbsize 数据数量
info   redis数据库信息
config get *    config配置文件
flushdb  清除当前数据库 
flushall 清除所有数据库
monitor       #实时监控
quit           退出连接
  1. redis安全性
设置密码:
auth 密码 /自启动redis-cli时 加上 -a 密码 

退出redis服务:
netstat -tunpl |grep redis     
kill  进程号    redis-cli shutdown
  1. 主从复制

目的::主要实现读写分离
实现 :在从服务器配置文件中添加主服务器的IP以及端口号

master可以拥有多个slave,slave还可以连接其他slave
scp  -r   文件名  ip  远程文件copy
slaveof 192.168.15.130  6379  
主服务器读写都可以,从服务器主能读
  1. redis事务

multi :开启事物
exec:执行

multi 开启事物,所有操作多在队列中。若执行中有一个个错误,其中有一个操作错误,但是这个操作不影响其它操作的,也就是说只有它操作失败,其它是操作成功。

执行exec,将队列中的操作都执行
  1. redis持久化

snapshotting 快照方式

   snapshotting 快照的方式将数据写入二进制文件中,默认是dump.rdb,这是默认方式 
   snapshotting设置格: save 900  1 在900秒内如果有一个key发生了改变,则发起快照保存

append-only 模式(跟oracle日志一样的),启开appendonly yes注解,启动aof模式

     appendfsync always  //收到命令就写入磁盘,速度慢
     appendfsync everysec  //每秒钟写入
     appendfsync  no  //完全依赖os,性能最好,持久化没保障

选择:由于snapshotting是一定时间保存数据,可能会导致数据丢失,所以一般都是使用aop方式 always保存。

  1. redis发布和订阅

操作流程:现在监听的窗口输入 subscribe 需要监听频道----》在需要发布的窗口使用publish 内容发布的频道 内容

subscribe  【频道】订阅、监听
publish    【频道】【发布内容】进行发布消息广播
  1. redis使用JavaApi

分片概念:3.0以前使用分片,3.0后使用集群 将数据分为固定的多个槽,根据下标取数据

jedis使用:jedis操作redis和命令操作redis是一致的

redis筛选: 多种数据类型配合使用

  1. redis集群

下面修改都是在redis配置文件中操作

修改redis端口号 (port)
绑定当前服务器地址 (bind ip),如果没有设置可能导致执行速度慢
修改数据文件保存地址 (dir )
cluster-enabled yes  注释放开,开启器群模式
cluster-config-file nodes-7001.conf    与端口对应
cluster-node-timeout 15000 
开启appendonly 模式
安装ruby  apt-get install ruby
安装ruby gems: apt-get install rubygems-integration

解决ruby版本过低:查看版本 ruby -v

扫描二维码关注公众号,回复: 4760391 查看本文章
安装apt-get  install curl 
执行 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 ,
安装curl -L get.rvm.io | bash -s stable,
source  /etc/profile.d/rvm.sh
rvm list known
rvm autolibs disable(不然安装报错404)
rvm install 2.4.1

集群操作开始

启动6个实例
查看redis服务是否启动  ps -ef|grep redis
安装redis集群接口  gem install redis
redis-trib.rb(redis 安装目录src下执行) create  --replicas(命令)   主节点数/从节点数 集群的多个服务器:端口号

在这里插入图片描述

  1. redis集群了解,以及常用命令

集群节点开启客户端:./redis-cli -c -h 【ip】 -p 【端口号】,数据存储到0-16383中随机槽,设置值后客户端自动自动跳转到槽所在的客户端。

图片展示的是主节点上分布的槽的下标:
     节点7001覆盖0-5460;
     节点7002覆盖5461-10922;
     节点7003覆盖10923-16383.

redis集群ruby命令:(集群的IP随意一个)

./redis-trib.rb create --replicas 创建集群  
./redis-trib.rb check   【ip:端口】  查询节点状态  
./redis-trib.rb add-node 【新节点ip:端口 +  集群中ip:端口】,新增主节点 ,刚加入的节点是没有槽的  ,从节点需要在redis-cli客户端执行cluster replicate  主节点id
./redis-trib.rb info 【ip:端口号】查看节点信息  或者是登录cli客户端查看  
./redis-trib.rb set-timeout 【ip:端口】设置心跳时间   
./redis-trib.rb reshard  【ip:端口号】-需要操作的节点,新增是:新节点id:端口    删除:删除的节点id:端口   
./redis-trib.rb add-node --slave --master-id $[nodeid]   (新建从节点的又一种方式)新节点ip:端口号  集群ip:端口号
./redis-trib del-node 127.0.0.1:7001 ${node-id}

重新分配槽:

redis-trib.rb reshard 【ip:端口号】
在这里插入图片描述
输入需要分配的槽:4096 ,需要刚加入集群节点id,ee3efb90e5ac0725f15238a64fc60a18a71205d7
在这里插入图片描述
询问你从哪里提取哈希槽:all /节点id
在这里插入图片描述
最后输入:done

  1. 集群操作JavaApi
// 集群JavaApi:
Set <HostAndPort> jedisClusterNode=new HashSet<HostAndPort>();
//定义集群中的
HostAndPort hostAndPort=new HostAndPort (ip,port)
jedisClusterNode.add( hostAndPort);
jedisPoolConfig  cfg=new jedisPoolConfig ();
//设置连接属性
cfg.setMaxTotal(1000);
//使用
jedisCluster  jc=new  jedisCluster (jedisClusterNode,600,100.cfg);
使用jc操作redis
  1. spring集成redis实现redisTemplate
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

redisTemplate缓存中数据乱码:

@Resource
private RedisTemplate redisTemplate; 
@Bean
public RedisTemplate<String, Object> stringSerializerRedisTemplate() {
RedisSerializer<String> = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
return redisTemplate;
}

猜你喜欢

转载自blog.csdn.net/pengjwhx/article/details/84107716