当前位置: 首页 > news >正文

淮北建设银行官方网站微信商城开店步骤

淮北建设银行官方网站,微信商城开店步骤,网站的收录率,网红营销是什么❤ 作者主页#xff1a;欢迎来到我的技术博客#x1f60e; ❀ 个人介绍#xff1a;大家好#xff0c;本人热衷于Java后端开发#xff0c;欢迎来交流学习哦#xff01;(#xffe3;▽#xffe3;)~* #x1f34a; 如果文章对您有帮助#xff0c;记得关注、点赞、收藏、… ❤ 作者主页欢迎来到我的技术博客 ❀ 个人介绍大家好本人热衷于Java后端开发欢迎来交流学习哦(▽)~* 如果文章对您有帮助记得关注、点赞、收藏、评论⭐️⭐️⭐️ 您的支持将是我创作的动力让我们一起加油进步吧 一、Redis简单介绍 Redis是一种键值型的NoSql数据库这里有两个关键字 键值型NoSql 其中键值型是指Redis中存储的数据都是以key.value对的形式存储而value的形式多种多样可以是字符串.数值.甚至json 而NoSql则是相对于传统关系型数据库而言有很大差异的一种数据库。 对于存储的数据没有类似Mysql那么严格的约束比如唯一性是否可以为null等等所以我们把这种松散结构的数据库称之为NoSQL数据库。 二、初始Redis 2.1 认识NoSQL NoSql可以翻译做Not Only Sql不仅仅是SQL或者是No Sql非Sql的数据库。是相对于传统关系型数据库而言有很大差异的一种特殊的数据库因此也称之为非关系型数据库。 2.1.1 结构化与非结构化 传统关系型数据库是结构化数据每一张表都有严格的约束信息字段名、字段数据类型、字段约束等等信息插入的数据必须遵守这些约束 而NoSql则对数据库格式没有严格约束往往形式松散自由。 可以是键值型 也可以是文档型 甚至可以是图格式 2.1.2 关联和非关联 传统数据库的表与表之间往往存在关联例如外键 而非关系型数据库不存在关联关系要维护关系要么靠代码中的业务逻辑要么靠数据之间的耦合 {id: 1,name: 张三,orders: [{id: 1,item: {id: 10, title: 荣耀6, price: 4999}},{id: 2,item: {id: 20, title: 小米11, price: 3999}}] }此处要维护“张三”的订单与商品“荣耀”和“小米11”的关系不得不冗余的将这两个商品保存在张三的订单文档中不够优雅。还是建议用业务来维护关联关系。 2.1.3 查询方式 传统关系型数据库会基于Sql语句做查询语法有统一标准 而不同的非关系数据库查询语法差异极大五花八门各种各样。 2.1.4 事务 传统关系型数据库能满足事务ACID的原则。 而非关系型数据库往往不支持事务或者不能严格保证ACID的特性只能实现基本的一致性。 2.1.5 总结 除了上述四点以外在存储方式、扩展性和查询性能上关系型与非关系型也都有着显著差异总结如下 存储方式 关系型数据库基于磁盘进行存储会有大量的磁盘IO对性能有一定影响。非关系型数据库他们的操作更多的是依赖于内存来操作内存的读写速度会非常快性能自然会好一些。 扩展性 关系型数据库集群模式一般是主从主从数据一致起到数据备份的作用称为垂直扩展。非关系型数据库可以将数据拆分存储在不同机器上可以保存海量数据解决内存大小有限的问题。称为水平扩展。关系型数据库因为表之间存在关联关系如果做水平扩展会给数据查询带来很多麻烦。 2.2 认识Redis Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器是一个基于内存的键值型NoSQL数据库。 特征 键值key-value型value支持多种不同数据结构功能丰富单线程每个命令具备原子性低延迟速度快基于内存.IO多路复用.良好的编码。支持数据持久化支持主从集群.分片集群支持多语言客户端 Redis的官方网站地址https://redis.io/ 2.3 安装Redis 大多数企业都是基于Linux服务器来部署项目而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis。 此处选择的Linux版本为CentOS 7。 2.4 Redis桌面客户端 安装完成Redis我们就可以操作Redis实现数据的CRUD了。这需要用到Redis客户端包括 命令行客户端图形化桌面客户端编程客户端 2.4.1 Redis命令行客户端 Redis安装完成后就自带了命令行客户端redis-cli使用方式如下 redis-cli [options] [commonds]其中常见的options有 -h 127.0.0.1指定要连接的redis节点的IP地址默认是127.0.0.1-p 6379指定要连接的redis节点的端口默认是6379-a 123321指定redis的访问密码 其中的commonds就是Redis的操作命令例如 ping与redis服务端做心跳测试服务端正常会返回pong 不指定commond时会进入redis-cli的交互控制台 2.4.2 图形化桌面客户端 GitHub上的大神编写了Redis的图形化桌面客户端地址https://github.com/uglide/RedisDesktopManager 不过该仓库提供的是RedisDesktopManager的源码并未提供windows安装包。 在下面这个仓库可以找到安装包https://github.com/lework/RedisDesktopManager-Windows/releases 2.4.3 安装 对压缩包进行解压安装即可。 2.4.4 建立连接 点击左上角的连接到Redis服务器按钮 在弹出的窗口中填写Redis服务信息 点击确定后在左侧菜单会出现这个链接 点击即可建立连接了。 Redis默认有16个仓库编号从0至15. 通过配置文件可以设置仓库数量但是不超过16并且不能自定义仓库名称。 如果是基于redis-cli连接Redis服务可以通过select命令来选择数据库 # 选择 0号库 select 0三、Redis 5 种基本数据结构详解 3.1 Redis Redis是一个key-value的数据库key一般是String类型不过value的类型多种多样 Redis为了方便我们学习将操作不同数据类型的命令也做了分组在官网 https://redis.io/commands 可以查看到不同的命令 当然我们也可以通过Help命令来帮助我们去查看命令 3.2 Redis通用命令 通用指令是部分数据类型的都可以使用的指令常见的有 KEYS查看符合模板的所有keyDEL删除一个指定的keyEXISTS判断key是否存在EXPIRE给一个key设置有效期有效期到期时该key会被自动删除TTL查看一个KEY的剩余有效期 通过help [command] 可以查看一个命令的具体用法例如 KEYS 127.0.0.1:6379 keys * 1) name 2) age 127.0.0.1:6379# 查询以a开头的key 127.0.0.1:6379 keys a* 1) age 127.0.0.1:6379贴心小提示在生产环境下不推荐使用keys 命令因为这个命令在key过多的情况下效率不高 DEL 127.0.0.1:6379 help delDEL key [key ...]summary: Delete a keysince: 1.0.0group: generic127.0.0.1:6379 del name #删除单个 (integer) 1 #成功删除1个127.0.0.1:6379 keys * 1) age127.0.0.1:6379 MSET k1 v1 k2 v2 k3 v3 #批量添加数据 OK127.0.0.1:6379 keys * 1) k3 2) k2 3) k1 4) age127.0.0.1:6379 del k1 k2 k3 k4 (integer) 3 #此处返回的是成功删除的key由于redis中只有k1,k2,k3 所以只成功删除3个最终返回 127.0.0.1:6379127.0.0.1:6379 keys * #再查询全部的key 1) age #只剩下一个了 127.0.0.1:6379EXISTS 127.0.0.1:6379 help EXISTSEXISTS key [key ...]summary: Determine if a key existssince: 1.0.0group: generic127.0.0.1:6379 exists age (integer) 1127.0.0.1:6379 exists name (integer) 0EXPIRE 贴心小提示内存非常宝贵对于一些数据我们应当给他一些过期时间当过期时间到了之后他就会自动被删除。 127.0.0.1:6379 expire age 10 (integer) 1127.0.0.1:6379 ttl age (integer) 8127.0.0.1:6379 ttl age (integer) 6127.0.0.1:6379 ttl age (integer) -2127.0.0.1:6379 ttl age (integer) -2 #当这个key过期了那么此时查询出来就是-2 127.0.0.1:6379 keys * (empty list or set)127.0.0.1:6379 set age 10 #如果没有设置过期时间 OK127.0.0.1:6379 ttl age (integer) -1 # ttl的返回值就是-13.3 String字符串 3.3.1 介绍 String 是 Redis 中最简单同时也是最常用的一个数据结构。 String 是一种二进制安全的数据结构可以用来存储任何类型的数据比如字符串、整数、浮点数、图片图片的 base64 编码或者解码或者图片的路径、序列化后的对象。 3.3.2 常用命令 命令说明SET key value设置指定 key 的值SETNX key value只有在 key 不存在时设置 key 的值GET key获取指定 key 的值MSET key1 value1 key2 value2 …设置一个或多个指定 key 的值MGET key1 key2 …获取一个或多个指定 key 的值STRLEN key返回 key 所储存的字符串值的长度INCR key将 key 中储存的数字值增一DECR key将 key 中储存的数字值减一EXISTS key判断指定 key 是否存在DEL key通用删除指定的 keyEXPIRE key seconds通用给指定 key 设置过期时间 更多 Redis String 命令以及详细使用指南请查看 Redis 官网对应的介绍https://redis.io/commands/?groupstring LPUSH和RPUSH 127.0.0.1:6379 LPUSH users 1 2 3 (integer) 3 127.0.0.1:6379 RPUSH users 4 5 6 (integer) 6LPOP和RPOP 127.0.0.1:6379 LPOP users 3 127.0.0.1:6379 RPOP users 6LRANGE 127.0.0.1:6379 LRANGE users 1 2 1) 1 2) 43.3.3 应用场景 需要存储常规数据的场景 举例 缓存 session、token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)。相关命令 SET、GET。 需要计数的场景 举例 用户单位时间的请求数简单限流可以用到、页面单位时间的访问数。相关命令 SET、GET、 INCR、DECR 。 分布式锁 利用 SETNX key value 命令可以实现一个最简易的分布式锁存在一些缺陷通常不建议这样实现分布式锁。 3.4 List列表 3.4.1 介绍 Redis中的List类型与Java中的LinkedList类似可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似 有序元素可以重复插入和删除快查询速度一般 3.4.2 常用命令 命令介绍RPUSH key value1 value2 …在指定列表的尾部右边添加一个或多个元素LPUSH key value1 value2 …在指定列表的头部左边添加一个或多个元素LSET key index value将指定列表索引 index 位置的值设置为 valueLPOP key移除并获取指定列表的第一个元素(最左边)RPOP key移除并获取指定列表的最后一个元素(最右边)LLEN key获取列表元素数量LRANGE key start end获取列表 start 和 end 之间 的元素 画了一个图方便大家理解 RPUSH , LPOP , lpush , RPOP 命令 更多 Redis List 命令以及详细使用指南请查看 Redis 官网对应的介绍https://redis.io/commands/?grouplist LPUSH和RPUSH 127.0.0.1:6379 LPUSH users 1 2 3 (integer) 3 127.0.0.1:6379 RPUSH users 4 5 6 (integer) 6LPOP和RPOP 127.0.0.1:6379 LPOP users 3 127.0.0.1:6379 RPOP users 6LRANGE 127.0.0.1:6379 LRANGE users 1 2 1) 1 2) 43.4.3 应用场景 信息流展示 举例 最新文章、最新动态。相关命令 LPUSH、LRANGE。 消息队列 Redis List 数据结构可以用来做消息队列只是功能过于简单且存在很多缺陷不建议这样做。 3.5 Hash哈希 3.5.1 介绍 Redis 中的 Hash 是一个 String 类型的 field-value键值对 的映射表特别适合用于存储对象后续操作的时候你可以直接修改这个对象中的某些字段的值。 3.5.2 常用命令 命令介绍HSET key field value设置指定哈希表中指定字段的值HSETNX key field value只有指定字段不存在时设置指定字段的值HMSET key field1 value1 field2 value2 …同时将一个或多个 field-value (域-值)对设置到指定哈希表中HGET key field获取指定哈希表中指定字段的值HMGET key field1 field2 …获取指定哈希表中一个或者多个指定字段的值HGETALL key获取指定哈希表中所有的键值对HEXISTS key field查看指定哈希表中指定的字段是否存在HDEL key field1 field2 …删除一个或多个哈希表字段HLEN key获取指定哈希表中字段的数量HINCRBY key field increment对指定哈希中的指定字段做运算操作正数为加负数为减 更多 Redis Hash 命令以及详细使用指南请查看 Redis 官网对应的介绍https://redis.io/commands/?grouphash HSET和HGET 127.0.0.1:6379 HSET heima:user:3 name Lucy//大key是 heima:user:3 小key是name小value是Lucy (integer) 1 127.0.0.1:6379 HSET heima:user:3 age 21// 如果操作不存在的数据则是新增 (integer) 1 127.0.0.1:6379 HSET heima:user:3 age 17 //如果操作存在的数据则是修改 (integer) 0 127.0.0.1:6379 HGET heima:user:3 name Lucy 127.0.0.1:6379 HGET heima:user:3 age 17HMSET和HMGET 127.0.0.1:6379 HMSET heima:user:4 name HanMeiMei OK 127.0.0.1:6379 HMSET heima:user:4 name LiLei age 20 sex man OK 127.0.0.1:6379 HMGET heima:user:4 name age sex 1) LiLei 2) 20 3) manHGETALL 127.0.0.1:6379 HGETALL heima:user:4 1) name 2) LiLei 3) age 4) 20 5) sex 6) manHKEYS和HVALS 127.0.0.1:6379 HKEYS heima:user:4 1) name 2) age 3) sex 127.0.0.1:6379 HVALS heima:user:4 1) LiLei 2) 20 3) manHINCRBY 127.0.0.1:6379 HINCRBY heima:user:4 age 2 (integer) 22 127.0.0.1:6379 HVALS heima:user:4 1) LiLei 2) 22 3) man 127.0.0.1:6379 HINCRBY heima:user:4 age -2 (integer) 20HSETNX 127.0.0.1:6379 HSETNX heima:user4 sex woman (integer) 1 127.0.0.1:6379 HGETALL heima:user:3 1) name 2) Lucy 3) age 4) 17 127.0.0.1:6379 HSETNX heima:user:3 sex woman (integer) 1 127.0.0.1:6379 HGETALL heima:user:3 1) name 2) Lucy 3) age 4) 17 5) sex 6) woman3.5.3 应用场景 对象数据存储场景 举例 用户信息、商品信息、文章信息、购物车信息。相关命令 HSET 设置单个字段的值、HMSET设置多个字段的值、HGET获取单个字段的值、HMGET获取多个字段的值。 3.6 Set集合 3.6.1 介绍 Redis 中的 Set 类型是一种无序集合集合中的元素没有先后顺序但都唯一有点类似于 Java 中的 HashSet 。当你需要存储一个列表数据又不希望出现重复数据时Set 是一个很好的选择并且 Set 提供了判断某个元素是否在一个 Set 集合内的重要接口这个也是 List 所不能提供的。 你可以基于 Set 轻易实现 交集、并集、差集 的操作比如你可以将一个用户所有的关注人存在一个集合中将其所有粉丝存在一个集合。这样的话Set 可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。这个过程也就是求交集的过程。 3.6.2 常见命令 命令介绍SADD key member1 member2 …向指定集合添加一个或多个元素SMEMBERS key获取指定集合中的所有元素SCARD key获取指定集合的元素数量SISMEMBER key member判断指定元素是否在指定集合中SINTER key1 key2 …获取给定所有集合的交集SINTERSTORE destination key1 key2 …将给定所有集合的交集存储在 destination 中SUNION key1 key2 …获取给定所有集合的并集SUNIONSTORE destination key1 key2 …将给定所有集合的并集存储在 destination 中SDIFF key1 key2 …获取给定所有集合的差集SDIFFSTORE destination key1 key2 …将给定所有集合的差集存储在 destination 中SPOP key count随机移除并获取指定集合中一个或多个元素SRANDMEMBER key count随机获取指定集合中指定数量的元素 更多 Redis Set 命令以及详细使用指南请查看 Redis 官网对应的介绍https://redis.io/commands/?groupset 127.0.0.1:6379 sadd s1 a b c (integer) 3 127.0.0.1:6379 smembers s1 1) c 2) b 3) a 127.0.0.1:6379 srem s1 a (integer) 1127.0.0.1:6379 SISMEMBER s1 a (integer) 0127.0.0.1:6379 SISMEMBER s1 b (integer) 1127.0.0.1:6379 SCARD s1 (integer) 2案例 将下列数据用Redis的Set集合来存储张三的好友有李四.王五.赵六李四的好友有王五.麻子.二狗利用Set的命令实现下列功能计算张三的好友有几人计算张三和李四有哪些共同好友查询哪些人是张三的好友却不是李四的好友查询张三和李四的好友总共有哪些人判断李四是否是张三的好友判断张三是否是李四的好友将李四从张三的好友列表中移除 127.0.0.1:6379 SADD zs lisi wangwu zhaoliu (integer) 3127.0.0.1:6379 SADD ls wangwu mazi ergou (integer) 3127.0.0.1:6379 SCARD zs (integer) 3127.0.0.1:6379 SINTER zs ls 1) wangwu127.0.0.1:6379 SDIFF zs ls 1) zhaoliu 2) lisi127.0.0.1:6379 SUNION zs ls 1) wangwu 2) zhaoliu 3) lisi 4) mazi 5) ergou127.0.0.1:6379 SISMEMBER zs lisi (integer) 1127.0.0.1:6379 SISMEMBER ls zhangsan (integer) 0127.0.0.1:6379 SREM zs lisi (integer) 1127.0.0.1:6379 SMEMBERS zs 1) zhaoliu 2) wangwu3.6.3 应用场景 需要存放的数据不能重复的场景 举例网站 UV 统计数据量巨大的场景还是 HyperLogLog更适合一些、文章点赞、动态点赞等场景。相关命令SCARD获取集合数量 。 需要获取多个数据源交集、并集和差集的场景 举例 共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐差集、音乐推荐差集 、订阅号推荐差集交集 等场景。相关命令SINTER交集、SINTERSTORE 交集、SUNION 并集、SUNIONSTORE并集、SDIFF差集、SDIFFSTORE 差集。 需要随机获取数据源中的元素的场景 举例 抽奖系统、随机。相关命令SPOP随机获取集合中的元素并移除适合不允许重复中奖的场景、SRANDMEMBER随机获取集合中的元素适合允许重复中奖的场景。 3. 7 Sorted Set有序集合 3.7.1 介绍 Sorted Set 类似于 Set但和 Set 相比Sorted Set 增加了一个权重参数 score使得集合中的元素能够按 score 进行有序排列还可以通过 score 的范围来获取元素的列表。有点像是 Java 中 HashMap 和 TreeSet 的结合体。 3.7.2 常用命令 命令介绍ZADD key score1 member1 score2 member2 …向指定有序集合添加一个或多个元素ZCARD KEY获取指定有序集合的元素数量ZSCORE key member获取指定有序集合中指定元素的 score 值ZINTERSTORE destination numkeys key1 key2 …将给定所有有序集合的交集存储在 destination 中对相同元素对应的 score 值进行 SUM 聚合操作numkeys 为集合数量ZUNIONSTORE destination numkeys key1 key2 …求并集其它和 ZINTERSTORE 类似ZDIFF destination numkeys key1 key2 …求差集其它和 ZINTERSTORE 类似ZRANGE key start end获取指定有序集合 start 和 end 之间的元素score 从低到高ZREVRANGE key start end获取指定有序集合 start 和 end 之间的元素score 从高到底ZREVRANK key member获取指定有序集合中指定元素的排名(score 从大到小排序) 更多 Redis Sorted Set 命令以及详细使用指南请查看 Redis 官网对应的介绍https://redis.io/commands/?groupsorted-set 3.7.3 应用场景 需要随机获取数据源中的元素根据某个权重进行排序的场景 举例 各种排行榜比如直播间送礼物的排行榜、朋友圈的微信步数排行榜、王者荣耀中的段位排行榜、话题热度排行榜等等。相关命令 ZRANGE (从小到大排序) 、 ZREVRANGE 从大到小排序、ZREVRANK (指定元素排名)。 需要存储的数据有优先级或者重要程度的场景 比如优先级任务队列。 举例 优先级任务队列。相关命令 ZRANGE (从小到大排序) 、 ZREVRANGE 从大到小排序、ZREVRANK (指定元素排名)。 四、Redis 3 种特殊数据结构详解 除了 5 种基本的数据结构之外Redis 还支持 3 种特殊的数据结构 Bitmap、HyperLogLog、GEO。 4.1 Bitmap 4.1.1 介绍 Bitmap 存储的是连续的二进制数字0 和 1通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte所以 Bitmap 本身会极大的节省储存空间。 你可以将 Bitmap 看作是一个存储二进制数字0 和 1的数组数组中每个元素的下标叫做 offset偏移量。 4.1.2 常用命令 命令说明SETBIT key offset value设置指定 offset 位置的值GETBIT key offset获取指定 offset 位置的值BITCOUNT key start end获取 start 和 end 之前值为 1 的元素个数BITOP operation destkey key1 key2 …对一个或多个 Bitmap 进行运算可用运算符有 AND, OR, XOR 以及 NOT # SETBIT 会返回之前位的值默认是 0这里会生成 7 个位 SETBIT mykey 7 1 (integer) 0 SETBIT mykey 7 0 (integer) 1 GETBIT mykey 7 (integer) 0 SETBIT mykey 6 1 (integer) 0 SETBIT mykey 8 1 (integer) 0 # 通过 bitcount 统计被被设置为 1 的位的数量。 BITCOUNT mykey (integer) 24.1.3 应用场景 需要保存状态信息0/1 即可表示的场景 举例 用户签到情况、活跃用户情况、用户行为统计比如是否点赞过某个视频。相关命令 SETBIT、GETBIT、BITCOUNT、BITOP。 4.2 HyperLogLog 4.2.1 介绍 HyperLogLog 是一种有名的基数计数概率算法 基于 LogLog Counting(LLC)优化改进得来并不是 Redis 特有的Redis 只是实现了这个算法并提供了一些开箱即用的 API。 Redis 提供的 HyperLogLog 占用空间非常非常小只需要 12k 的空间就能存储接近 2 64 2^{64} 264个不同元素。这是真的厉害这就是数学的魅力么并且Redis 对 HyperLogLog 的存储结构做了优化采用两种方式计数 稀疏矩阵 计数较少的时候占用空间很小。稠密矩阵 计数达到某个阈值的时候占用 12k 的空间。 基数计数概率算法为了节省内存并不会直接存储元数据而是通过一定的概率统计方法预估基数值集合中包含元素的个数。因此 HyperLogLog 的计数结果并不是一个精确值存在一定的误差标准误差为 0.81% 。。 4.2.2 常见命令 命令说明PFADD key element1 element2 …添加一个或多个元素到HyperLogLog 中PFCOUNT key1 key2获取一个或者多个 HyperLogLog 的唯一计数。PFMERGE destkey sourcekey1 sourcekey2 …将多个 HyperLogLog 合并到 destkey 中destkey 会结合多个源算出对应的唯一计数。 PFADD hll foo bar zap (integer) 1 PFADD hll zap zap zap (integer) 0 PFADD hll foo bar (integer) 0 PFCOUNT hll (integer) 3 PFADD some-other-hll 1 2 3 (integer) 1 PFCOUNT hll some-other-hll (integer) 6 PFMERGE desthll hll some-other-hll OK PFCOUNT desthll (integer) 64.2.3 应用场景 数量量巨大百万、千万级别以上的计数场景 举例 热门网站每日/每周/每月访问 ip 数统计、热门帖子 uv 统计。相关命令 PFADD、PFCOUNT 。 4.3 Geospatial index 4.3.1 介绍 Geospatial index地理空间索引简称 GEO 主要用于存储地理位置信息基于 Sorted Set 实现。通过 GEO 我们可以轻松实现两个位置距离的计算、获取指定位置附近的元素等功能。 4.3.2 常用命令 命令说明GEOADD key longitude1 latitude1 member1 …添加一个或多个元素对应的经纬度信息到GEO 中GEOPOS key member1 member2 …返回给定元素的经纬度信息GEODIST key member1 member2 M/KM/FT/MI返回两个给定元素之间的距离GEORADIUS key longitude latitude radius distance获取指定位置附近 distance 范围内的其他元素支持 ASC(由近到远)、DESC由远到近、Count(数量) 等参数GEORADIUSBYMEMBER key member radius distance类似于 GEORADIUS 命令只是参照的中心点是 GEO 中的元素 GEOADD personLocation 116.33 39.89 user1 116.34 39.90 user2 116.35 39.88 user3 3 GEOPOS personLocation user1 116.3299986720085144 39.89000061669732844 GEODIST personLocation user1 user2 km 1.40184.3.3 应用场景 需要管理使用地理空间数据的场景 举例附近的人。相关命令: GEOADD、GEORADIUS、GEORADIUSBYMEMBER 。 五、Redis的Java客户端-Jedis 在Redis官网中提供了各种语言的客户端地址https://redis.io/docs/clients/   其中Java客户端也包含很多 标记为星号的就是推荐使用的Java客户端包括 Jedis和Lettuce这两个主要是提供了Redis命令对应的API方便我们操作Redis而SpringDataRedis又对这两种做了抽象和封装因此我们后期会直接以SpringDataRedis来学习。Redisson是在Redis基础上实现了分布式的可伸缩的java数据结构例如Map.Queue等而且支持跨进程的同步机制Lock.Semaphore等待比较适合用来实现特殊的功能需求。 5.1 Jedis快速入门 创建maven工程引入依赖 !--jedis-- dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion3.7.0/version /dependency !--单元测试-- dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter/artifactIdversion5.7.0/versionscopetest/scope /dependency建立连接 private Jedis jedis;BeforeEach void setUp() {// 1.建立连接jedis new Jedis(192.168.150.101, 6379);// 2.设置密码jedis.auth(123321);// 3.选择库jedis.select(0); }测试 Test void testString() {// 存入数据String result jedis.set(name, 虎哥);System.out.println(result result);// 获取数据String name jedis.get(name);System.out.println(name name); }Test void testHash() {// 插入hash数据jedis.hset(user:1, name, Jack);jedis.hset(user:1, age, 21);// 获取MapString, String map jedis.hgetAll(user:1);System.out.println(map); }释放资源 AfterEach void tearDown() {if (jedis ! null) {jedis.close();} }5.2 Jedis连接池 Jedis本身是线程不安全的并且频繁的创建和销毁连接会有性能损耗因此我们推荐大家使用Jedis连接池代替Jedis的直连方式 有关池化思想并不仅仅是这里会使用很多地方都有比如说我们的数据库连接池比如我们tomcat中的线程池这些都是池化思想的体现。 5.2.1 创建Jedis连接池 public class JedisConnectionFacotry {private static final JedisPool jedisPool;static {//配置连接池JedisPoolConfig poolConfig new JedisPoolConfig();poolConfig.setMaxTotal(8);poolConfig.setMaxIdle(8);poolConfig.setMinIdle(0);poolConfig.setMaxWaitMillis(1000);//创建连接池对象jedisPool new JedisPool(poolConfig,192.168.150.101,6379,1000,123321);}public static Jedis getJedis(){return jedisPool.getResource();} }代码说明 1 JedisConnectionFacotry工厂设计模式是实际开发中非常常用的一种设计模式我们可以使用工厂去降低代的耦合比如Spring中的Bean的创建就用到了工厂设计模式。 2静态代码块随着类的加载而加载确保只能执行一次我们在加载当前工厂类的时候就可以执行static的操作完成对 连接池的初始化。 3最后提供返回连接池中连接的方法。 5.2.2 改造原始代码 在我们完成了使用工厂设计模式来完成代码的编写之后我们在获得连接时就可以通过工厂来获得。而不用直接去new对象降低耦合并且使用的还是连接池对象。 当我们使用了连接池后当我们关闭连接其实并不是关闭而是将Jedis还回连接池的。 BeforeEachvoid setUp(){//建立连接/*jedis new Jedis(127.0.0.1,6379);*/jedis JedisConnectionFacotry.getJedis();//选择库jedis.select(0);}AfterEachvoid tearDown() {if (jedis ! null) {jedis.close();}}六、Redis的Java客户端-SpringDataRedis SpringData是Spring中数据操作的模块包含对各种数据库的集成其中对Redis的集成模块就叫做SpringDataRedis官网地址https://spring.io/projects/spring-data-redis 提供了对不同Redis客户端的整合Lettuce和Jedis提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化支持基于Redis的JDKCollection实现 SpringDataRedis中提供了RedisTemplate工具类其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中 6.1 快速入门 创建一个springboot工程引入依赖 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.7/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.heima/groupIdartifactIdredis-demo/artifactIdversion0.0.1-SNAPSHOT/versionnameredis-demo/namedescriptionDemo project for Spring Boot/descriptionpropertiesjava.version1.8/java.version/propertiesdependencies!--redis依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!--common-pool--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependency!--Jackson依赖--dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build/project配置文件 spring:redis:host: 192.168.150.101port: 6379password: 123321lettuce:pool:max-active: 8 #最大连接max-idle: 8 #最大空闲连接min-idle: 0 #最小空闲连接max-wait: 100ms #连接等待时间测试 SpringBootTest class RedisDemoApplicationTests {Autowiredprivate RedisTemplateString, Object redisTemplate;Testvoid testString() {// 写入一条String数据redisTemplate.opsForValue().set(name, 虎哥);// 获取string数据Object name redisTemplate.opsForValue().get(name);System.out.println(name name);} }贴心小提示SpringDataJpa使用起来非常简单记住如下几个步骤即可 SpringDataRedis的使用步骤 引入spring-boot-starter-data-redis依赖在application.yml配置Redis信息注入RedisTemplate 6.2 数据序列化器 RedisTemplate可以接收任意Object作为值写入Redis 只不过写入前会把Object序列化为字节形式默认是采用JDK序列化得到的结果是这样的 缺点 可读性差内存占用较大 我们可以自定义RedisTemplate的序列化方式代码如下 Configuration public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory){// 创建RedisTemplate对象RedisTemplateString, Object template new RedisTemplate();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer new GenericJackson2JsonRedisSerializer();// 设置Key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置Value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;} }这里采用了JSON序列化来代替默认的JDK序列化方式。最终结果如图 整体可读性有了很大提升并且能将Java对象自动的序列化为JSON字符串并且查询时能自动把JSON反序列化为Java对象。不过其中记录了序列化时对应的class名称目的是为了查询时实现自动反序列化。这会带来额外的内存开销。 6.3 StringRedisTemplate 尽管JSON的序列化方式可以满足我们的需求但依然存在一些问题如图 为了在反序列化时知道对象的类型JSON序列化器会将类的class类型写入json结果中存入Redis会带来额外的内存开销。 为了减少内存的消耗我们可以采用手动序列化的方式换句话说就是不借助默认的序列化器而是我们自己来控制序列化的动作同时我们只采用String的序列化器这样在存储value时我们就不需要在内存中就不用多存储数据从而节约我们的内存空间。 这种用法比较普遍因此SpringDataRedis就提供了RedisTemplate的子类StringRedisTemplate它的key和value的序列化方式默认就是String方式。 省去了我们自定义RedisTemplate的序列化方式的步骤而是直接使用 SpringBootTest class RedisStringTests {Autowiredprivate StringRedisTemplate stringRedisTemplate;Testvoid testString() {// 写入一条String数据stringRedisTemplate.opsForValue().set(verify:phone:13600527634, 124143);// 获取string数据Object name stringRedisTemplate.opsForValue().get(name);System.out.println(name name);}private static final ObjectMapper mapper new ObjectMapper();Testvoid testSaveUser() throws JsonProcessingException {// 创建对象User user new User(虎哥, 21);// 手动序列化String json mapper.writeValueAsString(user);// 写入数据stringRedisTemplate.opsForValue().set(user:200, json);// 获取数据String jsonUser stringRedisTemplate.opsForValue().get(user:200);// 手动反序列化User user1 mapper.readValue(jsonUser, User.class);System.out.println(user1 user1);}}此时我们再来看一看存储的数据小伙伴们就会发现那个class数据已经不在了节约了我们的空间。 最后小总结 RedisTemplate的两种序列化实践方案 方案一 自定义RedisTemplate修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer 方案二 使用StringRedisTemplate写入Redis时手动把对象序列化为JSON读取Redis时手动把读取到的JSON反序列化为对象 6.4 Hash结构操作 这里简单对Hash结构操作一下 SpringBootTest class RedisStringTests {Autowiredprivate StringRedisTemplate stringRedisTemplate;Testvoid testHash() {stringRedisTemplate.opsForHash().put(user:400, name, 虎哥);stringRedisTemplate.opsForHash().put(user:400, age, 21);MapObject, Object entries stringRedisTemplate.opsForHash().entries(user:400);System.out.println(entries entries);} }非常感谢您阅读到这里如果这篇文章对您有帮助希望能留下您的点赞 关注 分享 留言thanks
http://www.dnsts.com.cn/news/24865.html

相关文章:

  • 用什么开发手机网站免费下载公司宣传册设计样本
  • 网站后台教程99作文网官网
  • 腾云网建设网站linux系统 wordpress
  • 做网站如何与美工配合创业ppt模板免费
  • 上海大金空调网站建设学做网站论坛会员账户
  • 凤岗镇网站仿做专业公司网站开发服务
  • 福州市住房和城乡建设网站app打包平台
  • 网站改版 翻译网站的虚拟人怎么做的
  • 网站开发国外研究状况百度集团股份有限公司
  • 建湖做网站找哪家好我开网店一天亏几百
  • 网站做百度推广需要哪些条件wordpress add_theme_support
  • 国外搜索网站排名专业的高端企业网站
  • 沈阳网站建设优化企业设计手绘
  • 扬州网站建设兼职用cms做网站的具体步骤
  • 可以发外链的网站整理wordpress上次附件
  • 怎么把自己的网站推广快速搭建网页
  • 福州有什么做网站的公司vps wordpress 安装
  • 爱站网ip反查域名国内ui设计公司
  • 国外毕业设计网站wordpress安装时数据库错误
  • 免费浏览的网站入口网站建设zgkr
  • 你需要网站建设电商网站取名
  • 宝丰网站建设网站的元素
  • 深圳生产型企业网站建设专业外贸网站建设哪家公司好
  • 三种常用的网站设计软件无锡设计师网站
  • 营销网站竞品分析报告网站做电商资质
  • wap自助建站排板wordpress如何做站群
  • 网站建设中中文模板下载广东省高水平建设专业网站
  • 购物网站备案网站建设求职信
  • 潍坊高端网站建设动态型网站建设
  • 如何推广自己的网站徐州建设工程交易信息网