为什么要用事务 Redis的单个命令是原子性的(比如get set mget mset),如果涉及到多个命令的时候,需要把多个命令作为一个不可分割的处理序列,就需要用到事务。 Redis的事务有两个特点: 按进入队列的顺序执行。 不会受到其他客户端的请求的影响。 这个显然不符合我们对原子性的定义,也就是我们没办法用Redis的这种事务机制来实现原子性,保证数据的一致。 为什么在一个事务中存在错误,Redis不回滚? 这种方式也有其合理之处:只有当被调用的Redis命令有语法错误时,这条命令才会执行失败(在将这个命令放入事务队列期间,Redis能够发现此类问题),或者对某个键执行不符合其数据类型的操作:实际上,这就意味着只有程序错误才会导致 Redis命令执行失败,这种错误很有可能在程序开发期间发现,一般很少在生产环境发现。
"slave-priority"2) "100"3) "slave-serve-stale-data"4) "yes"5) "slave-read-only"6) "yes"7) "slaveof"8)
四.编写启动脚本 1.根据情况填写对应变量 vim man-redis #! /bin/bash install_dir=/usr/local server_dir=redis log_dir=/var/log port=6379 if [[ "$1" == "start" ]] -eq 0 ];then echo "redis Already started" exit fi nohup ${install_dir}/${server_dir }/bin/redis-server ${install_dir}/${server_dir} &> ${log_dir}/${server_dir}/redis.log & elif [[ "$1" /usr/local/bin chmod +x /usr/local/bin/man-redis man-redis start
现代计算机用二进制作为信息的基本单位,一个字节等于8位。合理的利用位能够有效的提高内存使用率和开发效率。Bitmaps本身不是一种数据结构,实际上它就是字符串,但是他可以对字符串的位进行操作。 6379> setbit unique:users:2019-04-30 5 1 (integer) 0 127.0.0.1:6379> setbit unique:users:2019-04-30 8 -04-28 unique:users:2019-04-30 (integer) 3 127.0.0.1:6379> bitcount user:or:2019-04-28-30 (integer) 8
背景 Redis 的 API 非常简单和易于编程。处理使用命令行工具来连接,也可以用你喜欢的语言,本文描述使用 Go 语言 通过 go-redis 库连接。 个人更建议 使用 redigo库 来操作redis数据,参考我的另一篇文章使用 redigo 访问 redis。 1.go-redis 介绍 go-redis 是一个基于 Go 语言的 ,类型安全的 Redis 连接客户端框架 Github地址:https://github.com/go-redis/redis go-redis 是个很流行的类库 2. 参考 https://github.com/go-redis/redis 文档 https://godoc.org/github.com/go-redis/redis END
redis 客户端 -- Jedis 1. Jedis 直连 本质是 TCP 连接。 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0 </version> </dependency> 创建一个简单的 Jedis 直连的小例子: import redis.clients.jedis.Jedis; public class TestJedis { public static void main(String[] args) { // 1.生成一个 Jedis 对象,这个对象负责和指定 Redis 节点进行通信 ; import redis.clients.jedis.JedisPool; public class TestJedis { public static void main(String[
01 前言 从今天开始我们就要学习redis的源码了,想想还有点小激动呢。 前方高能预警,非战斗人员迅速撤离。 又一个但是来了,redis底层是用C语言写的,如果对C语言一窍不通,那还是算了,前方等待的是一座大山。墙裂推荐去了解一下C.emmmm,幸好我会C,哈哈哈,毕竟他是开启偶代码之路的小哥哥。 02 介绍 Redis没有直接使用C语言传统的字符串来表示(以空字符串结尾的字符数组),而是自己构造了一种名为简单动态字符串SDS。 之前看的String类型的数据结构底层就是用SDS实现的。 int free; //buf中剩余可用空间的长度 char buf[]; //初始化sds分配的数据空间 }; 举个栗子: 我们之前设置一个名为str1的字符串,值为redis buf为char[]的数组,分配了(len+1+free)个字节的长度,前len个字节保存redis这5个字符串,接下来1个字节保存了'\0',剩下的free个字节未使用。
Redis On K8s 优势很多: 1、可以通过运维平台对接k8s api,可以提高部署效率 2、扩缩容方便 3、迁移成本低,直连代理即可,和之前使用redis单机一样的配置 为什么这里没有采用小米的 redis on k8s方案? " means 8th and 9th slave will be replica with replica-priority=0 ## see also: https://redis.io/topics redis-1g 注意: 这个redis的yaml中,是开启了持久化的,我们的k8s还需要配置个default storgeclass,我这里用的是本机nfs(生产上可以用其它的解决方案) 等容器都启动好后 这样我们就可以通过 自研的服务去调k8s api(甚至用jenkins包装下执行apply一系列的yaml也行) 达到快速拉起一套redis集群的目的。
5、不建议过多使用Redis事务功能 Redis的事务功能较弱(不支持回滚),而且集群版本(自研和官方)要求一次事务操作的key必须在一个slot上(可以使用hashtag功能解决) 6、Redis集群版本在使用 Lua上有特殊要求 1、所有key都应该由 KEYS 数组来传递,redis.call/pcall 里面调用的redis命令,key的位置,必须是KEYS array, 否则直接返回error,"-ERR 四、相关工具 1、数据同步 redis间数据同步可以使用:redis-port 2、big key搜索 redis大key搜索工具 3、热点key寻找 内部实现使用monitor,所以建议短时间使用facebook 的redis-faina 阿里云Redis已经在内核层面解决热点key问题 五、删除bigkey 下面操作可以使用pipeline加速。 redis 4.0已经支持key的异步删除,欢迎使用。
root@temp ~# yum -y install keepalived.x86_64
一、Redis 中的发布/订阅功能 发布/ 订阅系统 是 Web 系统中比较常用的一个功能。 不持久化消息: 如果 Redis 停机重启,PubSub 的消息是不会持久化的,毕竟 Redis 宕机就相当于一个消费者都没有,所有的消息都会被直接丢弃。 integer) 3 # 共3个消息 3) radix-tree-keys 4) (integer) 1 5) radix-tree-nodes 6) (integer) 2 7) groups 8) Redis Stream Vs Kafka Redis 基于内存存储,这意味着它会比基于磁盘的 Kafka 快上一些,也意味着使用 Redis 我们 不能长时间存储大量数据。 Redis: Log Aggregation Capabilities and Performance - https://logz.io/blog/kafka-vs-redis/
使用规范 1、冷热数据分离,不要将所有数据全部都放到Redis中 虽然Redis 支持持久化,但是Redis的数据存储全部都是在内存中,成本昂贵。 2、不同的业务数据要分开存储 不相关的业务数据不要集中放到一个Redis实例中,建议新业务申请新的单独实例。 4、控制key的生命周期,redis不是垃圾桶 如果将redis定位为缓存Cache使用,对于存放的key一定要设置超时时间! 5、对于必须要存储的大文本数据一定要压缩后存储 大文本【超过500字节】写入到redis时,一定要压缩后存储! 3、严禁作为消息队列使用 没有非常特殊诉求,严禁将redis当作消息队列使用。redis当消息队列使用,会有容量、网络、效率、功能方面的多种问题。
Redis介绍 Redis是内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 命令相关 redis命令参考 开发常用命令介绍: key(键) # 查看当前key的数量 # (如果不知道key的规模的话不建议直接使用keys *,这样会遍历所有的key,可能造成阻塞) 127.0.0.1 6379> HGETALL website 1) "name" 2) "biaoge" 3) "url" 4) "xxbandy.github.io" 5) "id" 6) "1" 7) "desc" 8) " # 订阅该频道的客户端数量 3) "news.internet" 4) "1" 5) "news.sport" 6) "1" 7) "news.music" # 没有任何订阅者 8) "0" 运维常用的相关命令 运维相关的文章 redis超时相关的文章 Connection(链接) # 查看并设置redis密码 127.0.0.1:6379> config get requirepass
1.冷热数据分离,不要将所有数据全部都放到Redis中 虽然Redis支持持久化,但是Redis的数据存储全部都是在内存中的,成本昂贵。 2.不同的业务数据要分开存储 不要将不相关的业务数据都放到一个Redis实例中,建议新业务申请新的单独实例。 因为Redis为单线程处理,独立存储会减少不同业务相互操作的影响,提高请求响应速度;同时也避免单个实例内存数据量膨胀过大,在出现异常情况时可以更快恢复服务! 禁止使用Keys正则匹配操作 Redis是单线程处理,在线上KEY数量较多时,操作效率极低【时间复杂度为O(N)】,该命令一旦执行会严重阻塞线上其它命令的正常请求,而且在高QPS情况下会直接造成Redis 8.谨慎全量操作Hash、Set等集合结构 在使用HASH结构存储对象属性时,开始只有有限的十几个field,往往使用HGETALL获取所有成员,效率也很高,但是随着业务发展,会将field扩张到上百个甚至几百个
使用规范 1、冷热数据分离,不要将所有数据全部都放到Redis中 虽然Redis 支持持久化,但是Redis的数据存储全部都是在内存中,成本昂贵。 2、不同的业务数据要分开存储 不相关的业务数据不要集中放到一个Redis实例中,建议新业务申请新的单独实例。 4、控制key的生命周期,redis不是垃圾桶 如果将redis定位为缓存Cache使用,对于存放的key一定要设置超时时间! 5、对于必须要存储的大文本数据一定要压缩后存储 大文本【超过500字节】写入到redis时,一定要压缩后存储! 3、严禁作为消息队列使用 没有非常特殊诉求,严禁将redis当作消息队列使用。redis当消息队列使用,会有容量、网络、效率、功能方面的多种问题。
实现一个Redis module,支持两个扩展命令: 1) 可同时对hash的多个field进行incr操作; 2) incrby同时设置一个key的过期时间 在没有module之前,需要借助 有了module,不但可以实现逻辑复杂,且性能高的扩展,同时享受Redis的持久化和容灾能力。 // Redis命令扩展module #include "redismodule.h" #include <errno.h> #include <limits.h>
Redis开创了一种新的数据存储思路。 8、消息系统 消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。 Redis的8个应用场景 一:缓存—热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached 结合具体应用需要注意一下:很多人用spring的AOP来构建redis缓存的自动生产和清除,过程可能如下: select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话 ,select 数据库,然后将数据插入redis; update或者delete数据库钱,查询redis是否存在该数据,存在的话先删除redis中数据,然后再update或者delete数据库中的数据
/redis-6.0.1.tar.gz 复制代码 解压缩 [root@centos8 source]# tar -zxvf redis-6.0.1.tar.gz 复制代码 四,安装redis6.0.1 root@centos8 redis-6.0.1]# cp redis.conf /usr/local/soft/redis6/conf/ 复制代码 五,创建供redis运行的目录 分别用来存放redis 的日志和数据 logs:存放日志 data:存放快照数据 [root@centos8 data]# mkdir -p /data/redis6 [root@centos8 data]# cd /data /redis6/ [root@centos8 redis6]# mkdir logs [root@centos8 redis6]# mkdir data 复制代码 六,修改redis的配置文件: [root [root@centos8 ~]# systemctl stop redis6 复制代码 八,测试从本地连接访问: [root@centos8 conf]# /usr/local/soft/redis6
之前讲过Redis的介绍,及使用Redis带来的优势,这章整理了一下Redis的应用场景,也是非常重要的,学不学得好,能正常落地是关键。 下面一一来分析下Redis的应用场景都有哪些。 Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。 2、排行榜 很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。 Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。 3、计数器 什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。 Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。 8、消息系统 消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。
在 K8s 中,使用 helm 部署 redis 主从模式,一主可以有多从,可指定任意数量的从节点,扩容缩容都很方便。 Connect using the Redis CLI: redis-cli -h redis-redis-ha.dependency.svc.cluster.local # 8.资源验证 [root RESTARTS AGE pod/redis-redis-ha-server-0 2/2 Running 0 8m46s pod/redis-redis-ha-server -1 2/2 Running 0 8m39s pod/redis-redis-ha-server-2 2/2 Running 0 8m32s -0 ClusterIP 10.97.172.100 <none> 6379/TCP,26379/TCP 8m46s service/redis-redis-ha-announce