Redis--发布订阅命令和Redis事务 BitMap是一种新的数据类型。该数据类型本质上就是一个仅包含0和1的二进制字符串。其相关命令都是对这个字符串二进制位的操作。用于描述该字符串的属性由三个key、offset、bitValue。keyBitMap类型对应得key因为Redis是key-value型offsetBitMap是一个字符串其中每个字符都有对应得索引这个索引就是字符在BitMap中的偏移量offset这个offset的范围是【0232-1】bitValueBitMap数据都是一个仅包含0和1的二进制字符串每个offset位上字符称为bitValue。bitValue的值非0即1。setbit: 为给定key的BitMap数据的offset位置设置值为value。返回值为修改前该offset位置的bitValue。格式setbit key offset value注意对于原BitMap中不存在的offset进行复制字符串会自动伸展以确保它可以将value保存在指定offset上。​字符串伸展时空白位置以0填充。需要注意的是对使用较大offset的setbit操作。内存分配过程可能会造成Redis服务器阻塞。getbit获取指定offset上的位置bitValuebitcount统计字符串中bitValue为1的bit位数量。一般是统计整个字符串也可以指定额外的start和end参数实现对指定范围字符串的统计包括start和end在内。注意这里的start和end的单位是字节不是bit并且从0开始计数。格式bitcount key 【start】 【end】注意start和end可以使用负数-1表示最后一个字节-2表示倒数第二个。​ 对于不存在的key。被当成空字符来处理因此不存在的key进行bitcount操作的结果为0.bitpos返回BitMap中第一个值为指定值的二进制位的位置默认是检测整个BitMap。也可以指定要检测的范围。格式bitpos key bit 【start】 【end】bitop对一个或多个BitMap 进行二进制位操作并将结果保存到destkey上。格式bitop operation destkey key【key...】说明operation 可以是and、or、not、xor 这四种and对一个或多个BitMap 执行按位与操作or对一个或多个BitMap 执行按位或xor对一个或多个BitMap 执行按位异或not对一个或多个BitMap 执行按位异非​ 除了not操作之外其他操作都可以接收对一个或多个BitMap​ 除了not操作之外其他对一个BitMap的操作其实就是一个复制。​ 如果参与运算的多个BitMap长度不同较短的BitMap会以0作为补充位与较长的计算。应用场景由于offset的取值范围很大所以一般应用于大数据量的二值性统计。例如平台活跃用户统计访问或未访问、支持率、考勤统计、图像二值化等。不过对于数据量较小的二值性统计并不适合BitMap使用Set更为合适。HyperLogLog操作命令HyperLogLog 数据类型是一种超级日志记录。该数据类型可以简单理解成一个set集合集合元素为字符串。实际上HyperLogLog 是一种基数计数概率算法通过该算法可以利用极小的内存完成独立总数的统计。pfadd将任意数量的元素添加到HyperLogLog 集合里面格式pfadd key element 【element...】pfcount该命令作用于单个key时返回这个key的HyperLogLog 集合的近似基数(元素个数)​ 作用于多个key时返回所有key的HyperLogLog 集合的并集的近似基数。格式pfcount key 【key...】pfmerge将多个集合合并成一个集合并存储到destkey合并后的HyperLogLog 的基数接近于所有的HyperLogLog 集合的并集。格式pfmerge destkey sourcekey [sourcekey ...]应用场景HyperLogLog 可对数据量超级庞大的日志数据做不精确误差0.81%的去重计数统计。对于平台上每个页面每天的UV数据非常适合使用HyperLogLog 进行记录。Geospatial操作命令Geospatial 地理空间本质上还是一种集合只不过集合元素是一种由三部分构成的数据结构这种数据结构称为空间元素经度longitude。有效经度为【-180180】.正的表示东经负的表示西经。纬度latitude。有效维度为【-85.0511287885.05112878】正的表示北纬负的表示南纬位置名称也称为该85.05112878集合的空间元素名称。该类型可以设置、查询地理位置的经纬度查询某范围内的空间元素计算两个空间元素间的距离等。geoadd将一个或多个空间元素添加到集合中格式groadd key longitude latitude member 【 longitude latitude member...】geopos从指定的地理空间中返回指定元素的位置即经纬度格式geopos key member [member...]geodist返回2个位置之间的距离。其中unit必须是以下单位的一种m米默认、km、mi英里、ft英尺格式geodist key member1 member2 [unit]geohash:返回一个或多个位置元素的geohash值。格式geohash key member 【member...】说明geohash是一种地址编码方法它能把二维的空间经纬度数据编码成一个字符串该值主要用于底层应用或者调试实际作用不大。georadius以指定的经纬度为中心返回指定地理空间中包含的所有位置元素中与中心举例不超过半径的元素返回时还可以携带额外信息withdist返回时携带位置元素与中心之间的距离单位和用户给定的范围单位保持一致。withcoord将位置元素的经纬度也返回withhash将位置元素的geohash也返回不过这个hash以整数形式表示。命令默认返回未排序的位置元素。可通过以下两个参数指定返回位置元素的排序方式asc根据中心位置从近到远的方式排序desc根据中心位置从远到近的方式排序返回结果包含中心点元素。格式georadius key longitude latitude radius 【unit】【withcoord】【withdist】【withhash】【asc|desc】 [count]georadiusbymember和上面命令一样只是该命令的中心是由位置元素给定的而不是经纬度。格式georadiusbymember key member radius 【unit】【withcoord】【withdist】【withhash】【asc|desc】 [count]应用场景微信发现中的“附近”功能钉钉签到功能等。发布/订阅命令消息系统发布/订阅pub/sub 是一种消息通信模式发布者消息生产者生产和发送消息到存储系统订阅者消息消费者从存储系统接收和消费消息。这个存储系统可以是文件系统FS、消息中间件MQ、数据库管理系统DBMS也可以是Redis。订阅者订阅消息后只要存储系统中有该类消息就可以不断的接收并消费这些消息。当存储系统中没有消息后订阅者就会阻塞。当发布者将消息写入存储系统后会立即唤醒订阅者。当存储系统放满时不同的发布者有不同的处理方式有的会阻塞发布者发布有的会将多余消息丢失。不同的消息系统的发布/订阅方式不同RocketMQ、KAfka等消息中间件构成的消息系统消息是以主题Topic分类的Redis’则是以频道channel分类的。subscribe: Redis客户端消费者通过此命令可以同时订阅任意数量的频道。在输出了主题后命令处于阻塞状态等待相关频道的消息。格式subscribe channel 【channel...】psubscribe: 订阅一个或多个符合给定模式的频道格式psubscribe pattern [pattern...]比如psubscribe news.*说明这里的模式只能使用通配符*。publish发布一个频道消息返回值为接收到该消息的订阅者·数量。格式publish channel messageunsubscribe: 退订指定的频道格式unsubscribe 【channel 【channel...】】说明如果没有频道被指定那么客户端退订所有频道这种情况会返回一个信息告知客户端所有被退订的频道。punsubscribe退订一个或多个符合给定模式的频道。效果和unsubscribe 相同。pubsub查看订阅/发布系统状态的内省命令集。pubsub numpat查询当前Redis所有客户端订阅的所有频道模式的数量总和。pubsub channels: 列出当前所有的活跃频道至少有一个订阅者的频道格式pubsub channels 【pattern】说明pattern参数可选如果不指定pattern参数会列出所有的活跃频道​ 如果给出pattern参数只能使用通配符*只列出相匹配的活跃频道。pubsub numsub: 返回给定频道的订阅者数量。不给定任何频道就返回一个空列表。Redis事务Redis事务本质是一组命令的批处理。这组命令在执行过程中会被顺序地、一次性全部执行完毕只要没出现语法错误这组命令在执行期间是不会被中断的。Redis事务特性Redis事务不具有ACID特性仅保证了数据的一致性这组命令中的某些命令的执行失败不影响其他命令的执行不会引发回滚。不具备原子性。这组命令通过乐观锁机制实现了简单的隔离性。没有复杂的隔离级别。这组命令的执行结果是被写入到内存是否持久取决于Redis的持久化策略与事务无关。Redis事务实现三个命令Redis事务通过三个命令进行控制muti开启事务进入队列等待执行。exec执行事务discard取消事务具体应用Redis事务异常处理语法错误整个事务作废全部不执行运行时错误错的报错对的照常执行无自动回滚WATCH 冲突事务放弃业务层循环重试Redis事务隔离机制使用乐观锁实现事务隔离。Redis通过watch命令再配合事务实现了多线程下的隔离操作。