高并发核心技术Redis系列(三)--------基本知识(中)

简介: Hash是一个键值对的集合。

5 五大数据类型-Hash(哈希)

5.1 简介

Hash是一个键值对的集合。

Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。每个 Hash 可以存储 键值对(40多亿)。

2345_image_file_copy_117.jpg

Hash存储结构优化

  如果field数量较少,存储结构优化为类数组结构

   如果field数量较多,存储结构使用HashMap结构

5.2 常用命令

    1. hset key field value给key集合中的field赋值value。

    如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

    如果字段已经存在于哈希表中,旧值将被重写。

hset user name baizhan 创建一个key为user的哈希,并创建name字段,给name字段赋值为
baizhan
hset user age 3    在key为user的哈希中,创建age字段赋值为3
hset user name shangxuetang 将key为user的哈希name字段修改为shangxuetang

2. hget key field从key哈希中,取出field字段的值。

hget user name 从key为user的哈希中取出name字段的值,结果为shangxuetang

3. hmset key field1 value1 field2 value2……批量设置哈希的字段及值。

hmset user1 name bjsxt age 15 创建一个key为user1的哈希,有两个字段name和age

4. hexists key field 判断指定key中是否存在field

如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。

hexists user name 返回1

5. hkeys key获取该哈希中所有的field。

6. hvals key获取该哈希中所有的value。

7. hincrby key field increment为哈希表key中的field字段的值加上增量increment。

增量也可以为负数,相当于对指定字段进行减法操作。

如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令。

如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。

对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。

hincrby user age 10 对user中的age字段做运算,增加10

8. hdel key field1 field2……删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。

返回被成功删除字段的数量,不包括被忽略的字段。

hdel user name age 删除user中的name和age字段

9. hsetnx key field value给key哈希表中不存在的的字段赋值 。

如果哈希表不存在,一个新的哈希表被创建并进行 hsetnx 操作。

如果字段已经存在于哈希表中,操作无效。

如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。

hsetnx user name

6 五大数据类型-Zset(有序集合)

6.1 简介

Zset与Set非常相似,是一个没有重复元素的String集合。

不同之处是Zset的每个元素都关联了一个分数(score),这个分数被用来按照从低分到高分的方式排序集合中的元素。集合的元素是唯一的,但分数可以重复。

因为元素是有序的,所以可以根据分数(score)或者次序(position)来获取一个范围内的元素。

6.2 常用命令

1. zadd key score1 value1 score2 value2……将一个或多个元素(value)及分数(score)加入到

有序集key中。

如果某个元素已经是有序集的元素,那么更新这个元素的分数值,并通过重新插入这个元素,来保

证该元素在正确的位置上。

分数值可以是整数值或双精度浮点数。

如果有序集合 key 不存在,则创建一个空的有序集并执行 zadd 操作。

zadd k1 100 java 200 c++ 300 python 400 php

2. zrange key start end [withscores]返回key集合中的索引start和索引end之间的元素(包含start和end)。

其中元素的位置按分数值递增(从小到大)来排序。 其中 0 表示列表的第一个元素,-1表示最后一个元素。

withscores是可选参数,是否返回分数。

zrange k1 0 -1 返回集合中所有元素
zrange k1 0 -1 withscores 返回集合中所有元素,并携带元素分数

3. zrangebyscore key minscore maxscore [withscores]返回key集合中的分数minscore 和分数maxscore 之间的元素(包含minscore 和maxscore )。其中元素的位置按分数值递增(从小到大)

来排序。

zrangebyscore k1 200 400 返回200-400分之间的元素递增排序

4. zrevrangebyscore key maxscore minscore [withscores]返回key集合中的分数maxscore和

分数minxscore 之间的元素(包含maxscore和minxscore )。其中元素的位置按分数值递减(从大

到小)来排序。

zrevrangebyscore k1 400 200 返回200-400分之间的元素递减法排序

5. zincrby key increment value为元素value的score加上increment的值。

zincrby k1 50 java 给java元素加上50分

6. zrem key value删除该集合下value的元素。

zrem k1 php 删除php

7. zcount key minscore maxscore统计该集合在minscore 到maxscore分数区间中元素的个数。

zcount k1 100 300 统计100分到300分中间元素的个数

8. zrank key value返回value在集合中的排名,从0开始。

zrank k1 c++ 返回c++排名

7 新数据类型-Bitmaps

7.1 简介

在计算机中,用二进制(位)作为存储信息的基本单位,1个字节等于8位。

例如 "abc" 字符串是由 3 个字节组成,计算机存储时使用其二进制表示,"abc"分别对应的ASCII码是97、98、99,对应的二进制是01100001、01100010、01100011,在内存中表示如下:

2345_image_file_copy_118.jpg

合理地使用 位 能够有效地提高内存使用率和开发效率。

Redis提供了Bitmaps这个 “数据结构” 可以实现对位的操作:

1. Bitmaps 本身不是一种数据结构,实际上它就是字符串(key 对应的 value 就是上图中的一串二进制),但是它可以对字符串的位进行操作。

2. Bitmaps 单独提供了一套命令,所以在 Redis 中使用 Bitmaps 和使用字符串的方法不太相同。可以把 Bitmaps 想象成一个以位为单位的数组,数组的每个单元只能存储 0 和 1,数组的下标在

Bitmaps中叫做偏移量。

2345_image_file_copy_119.jpg

7.2 常用命令

1. setbit key offset value设置Bitmaps中某个偏移量的值。

偏移量从0开始,且value值只能为0或1。

setbit sign 0 1 设置sign的第一位值为1
setbit sign 1 1 设置sign的第二位值为1
setbit sign 2 0 设置sign的第三位值为0
setbit sign 3 1 设置sign的第四位值为1

2345_image_file_copy_120.jpg

2. getbit key offset 获取Bitmaps中某个偏移量的值。

获取key的offset 的值。

getbit sign 3 获取偏移量为3的值,结果为1

如果偏移量未设置值,则也返回0。

getbit sign 99 获取偏移量为99的值,结果为0

3. bitcount key [start end]统计字符串被设置为1的bit数量。一般情况下,给定的整个字符串都会

被进行统计,可以选择通过额外的start和end参数,指定字节组范围内进行统计(包括start和

end),0表示第一个元素,-1表示最后一个元素。

bitcount sign 获取整个字符串被设置为1的bit数量,结果为3

如:当前存在一个key为k1的bitmaps存储着[00000001,00000001,00000010,00000011],分别对

应[1,1,2,3]。

setbit num 7 1 
setbit num 15 1
setbit num 22 1
setbit num 30 1
setbit num 31 1
bitcount num 1 2 统计索引1、2两个字节组中bit=1的数量,即统计00000001,00000010中
bit=1的数量,结果为2
bitcount num 1 3 统计索引1、2、3三个字节组中bit=1的数量,即统计
00000001,00000010,00000011中bit=1的数量,结果为4
bitcount num 0 -1 统计所有的字节组中bit=1的数量,结果为5

setbit设置或获取的是bit(位)的位置,bitcount计算的是byte(字节)位置。

4. bitop and/or destkey sourcekey1 sourcekey2……将多个bitmaps通过求交集/并集方式合并成一个新的bitmaps。

bitop and k3 k1 k2 通过求交集将k1 k2合并成k3
bitop or k3 k1 k2 通过求并集将k1 k2合并成k3

2345_image_file_copy_121.jpg

8 新数据类型-Geospatia

 8.1 简介

 GEO,Geographic,地理信息的缩写。

该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。

8.2 常用命令

1. geoadd key longitude latitude member [longitude latitude member ..……]用于存储指定

的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到

指定的 key 中。

geoadd chinacity 116.405285 39.904989 beijing 将北京的经纬度和名称添加到chinacity
geoadd chinacity 104.065735 30.659462 chengdu 121.472644 31.231706 shanghai
将成都和上海的经纬度、名称添加到chinacity

有效的经度:-180 ~ +180 有效的纬度:-85.05 ~ +85.05,当设置的经度纬度值超过范围会报错。

两级无法直接添加。

一般会直接下载城市数据,直接通过java程序直接一次性导入。

2. geopos key member [member ……]**从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。

geopos chinacity shanghai beijing 返回chinacity中名称为shanghai和beijing的经纬度

3. geodist key member1 member2 [m|km|ft|mi]用于返回两个给定位置之间的距离。

最后一个距离单位参数说明:

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。
geodist chinacity shanghai beijing 返回shanghai和beijing之间的距离,结果
1067597.9668,单位米
geodist chinacity shanghai chengdu km 返回shanghai和chengdu之间的距离,结果
1660.0198,单位是千米

4. georadius key longitude latitude radius m|km|ft|mi 以给定的经纬度(longitude latitude)为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离(radius )的所有位置元素。

georadius chinacity 116 40 1200 km 获取经纬度116 40为中心,在chinacity内1200公里
范围内的所有元素。结果shanghai beijing


目录
相关文章
|
10月前
|
缓存 关系型数据库 MySQL
在MySQL中处理高并发和负载峰值的关键技术与策略
采用上述策略和技术时,每个环节都要进行细致的规划和测试,确保数据库系统既能满足高并发的要求,又要保持足够的灵活性来应对各种突发的流量峰值。实施时,合理评估和测试改动对系统性能的影响,避免单一措施可能引起的连锁反应。持续的系统监控和分析将对维护系统稳定性和进行未来规划提供重要信息。
456 15
|
11月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
3167 7
|
10月前
|
缓存 NoSQL Java
Java 项目实操高并发电商系统核心模块实现从基础到进阶的长尾技术要点详解 Java 项目实操
本项目实战实现高并发电商系统核心模块,涵盖商品、订单与库存服务。采用Spring Boot 3、Redis 7、RabbitMQ等最新技术栈,通过秒杀场景解决库存超卖、限流熔断及分布式事务难题。结合多级缓存优化查询性能,提升系统稳定性与吞吐能力,适用于Java微服务开发进阶学习。
549 0
|
12月前
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
919 3
|
缓存 NoSQL 架构师
Redis批量查询的四种技巧,应对高并发场景的利器!
在高并发场景下,巧妙地利用缓存批量查询技巧能够显著提高系统性能。 在笔者看来,熟练掌握细粒度的缓存使用是每位架构师必备的技能。因此,在本文中,我们将深入探讨 Redis 中批量查询的一些技巧,希望能够给你带来一些启发。
Redis批量查询的四种技巧,应对高并发场景的利器!
|
人工智能 缓存 NoSQL
高并发秒杀系统设计:关键技术解析与典型陷阱规避
在电商、在线票务等场景中,高并发秒杀活动对系统性能和稳定性提出极大挑战。海量请求可能导致服务器资源耗尽、数据库锁争用及库存超卖等问题。通过飞算JavaAI生成的Redis + Lua分布式锁代码,可有效解决高并发下的锁问题,提升系统QPS达70%,同时避免缓存击穿与库存超卖。相较传统写法,AI优化代码显著提高性能与响应速度,为高并发系统开发提供高效解决方案。
|
消息中间件 Java Linux
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
|
8月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
缓存 NoSQL Java
Java高并发实战:利用线程池和Redis实现高效数据入库
Java高并发实战:利用线程池和Redis实现高效数据入库
1176 0
|
存储 NoSQL Java
探索Java分布式锁:在高并发环境下的同步访问实现与优化
【6月更文挑战第30天】Java分布式锁在高并发下确保数据一致性,通过Redis的SETNX、ZooKeeper的临时节点、数据库操作等方式实现。优化策略包括锁超时重试、续期、公平性及性能提升,关键在于平衡同步与效率,适应大规模分布式系统的需求。
606 1

热门文章

最新文章