redis实战

主要用作缓存功能,不用来做数据库和消息服务器

我们提供的服务有:网站设计、网站制作、微信公众号开发、网站优化、网站认证、八步ssl等。为数千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的八步网站制作公司

单点服务器搭建

1:下载release包:
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
解压:tar -zxvf
2:进入目录后编译:make,需要安装c:yum install gcc-c++
编译时:jemalloc/jemalloc.h: No such file or directory
jemalloc重载了LInux的ANSI C的malloc和free函数:make的时候指定参数:
make MALLOC=libc
编译后文件都在src中
3:启动服务器:
src/redis-server
4:连接服务器:src/redis-cli

集群搭建

使用的是4.0以上的环境,利用自带的ruby脚本搭建redis cluster,需要至少6个节点,三主三从
1:分别在多个节点上安装单服务器,然后修改redis.conf文件
最小化配置:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf //启动的时候会由redis生成和管理
cluster-node-timeout 5000
appendonly yes
bind 10.99.32.16 //需要绑定自己节点的ip,否则外部不能访问
2:启动时使用src/redis-server ./redis.conf
多台实例分别启动
3:如果已经安装ruby则不需要执行这一步
安装ruby的过程:
下载release包:
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
解压,./configure && make && make install
安装完毕后即可以使用gem install redis
安装过程可能会报错,自行解决。
4:src/redis-trib.rb create --replicas 1 10.99.32.16:6379 10.99.32.17:6379 10.99.32.18:6379 10.99.32.20:6379 10.99.32.22:6379 10.99.32.23:6379
最少需要6个节点
出现[OK] All 16384 slots covered.即为成功
5:追加新节点
1:先启动节点实例
2:使用redis-trib.rb
./redis-trib.rb add-node myNewNodeIp:port
追加副本节点:
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
给新副本节点指定master节点:
./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
6:移除节点
./redis-trib del-node myip:port mynodeId

一些概念

集群端口:
每一个redis集群节点需要开启两个tcp连接。一个是客户端连接,例如默认6379,plus端口通过增加10000来获取数据端口,例如16379
另一个端口是集群总线,这是节点对节点的通信通道,使用二进制传输协议。节点通过集群总线来侦测故障,配置更新和故障转移授权和更多。客户端不应该使用集群总线端口进行通信,但可以使用redis命令端口。

集群数据分片:把数据分散到各个节点进行保存。redis集群不会使用始终如一的hashing,但每个分片一个key的形式,称之为hash slot。redis有16384个hash slot,并且计算出hash slot的key。例如有3个节点
NodeA包含 hash slot 0-5500
NodeB包含5501-11000
NodeC包含11011-16383

redis cluster不保证强一致性

直接运行redis服务器时会在前端运行,如果需要在后台运行:
后台运行redis:把配置文件redis.conf的 daemonize改成yes

-
配置集群时,如果出现卡着一直不懂,可能之前配置过一些节点,关闭了再重新运行脚本。如果运行脚本报:Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in databas
解决:删除appendonly.aof文件和nodes.conf文件

-
缓存key的设计:
1:最长是1024字节,不要太长,不要太短,key比对耗时
2:使用schema来标识,例如com.payment.User:id
二进制安全字符:不会解析一些特殊字符,例如转义符号等
Redis key:是二进制安全的,这意味着你可以使用任意二进制序列作为一个key,从一个字符串像foo到一个jpeg文件的内容。空字符串同样是合法的key
key的少量其他规则:
1:非常长的key不是一个好主意,1024byte的key不好
2:太短的key也不好

数据类型

数据类型:
String:最基础的数据类型,是二进制安全的,意味着,Redis字符串可以包含任何类型的数据,
一个String值可以最大512M
1:可以使用String作为原子计数器,使用INCR,DECR,INCRBY
2:字符串追加,使用APPEND命令
3:使用字符串作为随机访问vector
4:对大量数据进行编码,压缩进小空间

List:按插入顺序排序。头部或者尾部tail,left或者right
list最大长度是2的32次方-1
redis的list主要的功能是支持常量时间插入和删除头部和尾部的元素。即使很多插入的数据
访问两端的元素是非常快速的,但如果想访问中间的元素会很慢,是O(N)的操作。
主要用途:
1:建立社交网络时间轴模型,使用lpush插入,然后使用lrange来获取少量最近插入的数据
2:可以使用lpush和ltrim来创建一个永远不会超出给定数量的list,但要记住最新的N个元素。
3:list可以用来作为原始消息传递
4:可以做大量内容

set:不排序的字符串集合,执行O(1)。
Redis Set不允许重复的成员,添加相同的成员会导致有一个独立的副本。实际上着意味着添加成员不需要检查是否已经存在。
可以在服务器端做联合操作
set的长度是2的32次方-1
主要用途:
1:可以跟踪唯一内容,例如想要知道所有帖子的唯一ip地址,简单地使用SADD来处理一个页面,这样可以确保没有重复的ip呗添加
2:能够很好地标识关联关系。可以创建一个标签系统。这样可以添加所有有指定标签的对象的id到集合中。
3:可以使用set来抽取元素,spop,srandmember

hash:一个map类型,字段和值,用来表示对象,例如user:1 userObj
一个带有少量字段的hash可以使用很少的空间来存储。,因此可以存储百万级对象在一个很小的redis实例中。hash主要用来标识对象,他们能存储许多元素,因此你可能够使用hash来保存其他内容
每个hashkey存储2的32次方-1个key-value对,多于4亿对

持久化

redis提供持久化选项:
1:RDB:执行某个时间点的快照
2:AOF:记录所有服务器收到的写操作,可以在服务器重启的时候重新执行,构造原始的数据集。使用追加方式。redis能够在日志很大的时候在后台重写。
3:可以禁止持久化,数据只在服务器运行的时候存在
4:在同一个实例中组合AOF,RDB。在这种情况下,当redis重新启动,AOF文件就会被用来构造原始数据,

RDB优点:
1:RDB是一个非常紧凑的独立文件,代表redis某个时间点的数据。rdb文件优先用来做备份。例如,你可以每小时压缩你的RDB文件,然后每天保存一个RDB的快照。这样可以很容易恢复不同版本的数据。
2:RDB是一个非常好的灾难恢复,作为单独的压缩文件,可以传输到数据中心
3:RDB最大化redis的性能,因为redis父进程只需要进行分配,而子进程则完成其余的内容。
4:RDB允许快速启动,而AOF则不能

RDB缺点:
1:如果需要尽可能少的数据丢失,RDB不是一个好的方式。你需要配置很多个保存点才能保证数据少丢失。
2:RDB需要经常fork来使子进程能够进行持久化数据。

AOF优点:
1:使用AOF,redis更持久化,可以使用不同的fsync策略。使用这些fsync策略,每秒写执行都会在一个后台程序中保存。
2:AOF是一个仅追加日志
3:redis能够在AOF文件过大的时候自动重写,重写是安全的。
4:AOF包含了所有操作的日志

AOF缺点:
1:AOF文件比RDB文件大
2:AOF比RDB慢,fsync策略会每秒执行一次记录
3:bug

分布式唯一ID

采用41bit存放时间:精确到毫秒
12bit存放节点分片的ID:最大值为4095
10bit存放自增ID:
比如GTM时间 Fri Mar 13 10:00:00 CST 2015 ,它的距1970年的毫秒数是 1426212000000,假定分片ID是53,自增长序列是4,则生成的ID是:
5981966696448054276 = 1426212000000 << 22 + 53 << 10 + 4

结合spring进行缓存操作

spring boot里面使用的是Lettuce客户端连接
1:引入依赖

org.springframework.boot
spring-boot-starter-data-redis

2:配置redis服务器
spring.redis.host=redis-cs
spring.redis.port=6379
spring.redis.timeout=60000
这里是简单的配置,还可以配置连接密码
3:配置连接工厂


@Resource
private LettuceConnectionFactory myLettuceConnectionFactory;
@Bean
    public RedisTemplate redisTemplate() {
            RedisTemplate template = new RedisTemplate<>();
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            template.setConnectionFactory(myLettuceConnectionFactory);
            return template;
}

4:注入RedisTemplate

@Autowired
private RedisTemplate redisTemplate;


本文名称:redis实战
文章出自:http://hbruida.cn/article/ijpsec.html