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

一个网站的运营成本wordpress m3u8播放器

一个网站的运营成本,wordpress m3u8播放器,郑青松找谁做的网站,免备案域名直购Redis入门 一、初识Redis Redis是一种键值型的NoSql数据库。 其中键值型#xff0c;是指Redis中存储的数据都是以key、value对的形式存储#xff0c;而value的形式多种多样#xff0c;可以是字符串、数值#xff0c;甚至是json。 NoSql则是相对于传统关系型数据库而言是指Redis中存储的数据都是以key、value对的形式存储而value的形式多种多样可以是字符串、数值甚至是json。 NoSql则是相对于传统关系型数据库而言有很大差异的一种数据库。 1.1 认识NoSQL NoSql可以翻译为Not Only Sql不仅仅是SQL或者是No Sql非Sql的数据库。是相对于传统关系型数据库而言有很大差异的一种特殊的数据库因此也称之为非关系型数据库。 1.1.1 结构化与非结构化 传统关系型数据库是结构化数据每一张表都有严格的约束信息字段名、字段数据类型、字段约束等等信息插入的数据必须遵守这些约束。 而NoSql则对数据库格式没有严格约束往往形式松散、自由。 可以是键值型 也可以是文档型 甚至可以是图格式 1.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“的关系不得不冗余的将这两个商品保存在”张三“的订单文档中不够优雅。还是建议用业务来维护关联关系。 1.1.3 查询方式 传统关系型数据库会基于Sql语句做查询语法有统一标准 而不同的非关系型数据库查询语法差异极大。 1.1.4 事务 传统关系型数据库能满足事务ACID的原则。 而非关系型数据库往往不支持事务或者不能严格保证ACID的特性只能实现基本的一致性。 1.1.5 总结 除了上述四点之外在存储方式、扩展性、查询性能上关系型与非关系型也都有着显著差异总结如下 存储方式 关系型数据库基于磁盘进行存储会有大量的磁盘IO对性能有一定影响非关系型数据库他们的操作更多的是依赖于内存来操作内存的读写速度会非常快性能自然会好一些 扩展性 关系型数据库集群模式一般是主从主从数据一致起到数据备份的作用称为垂直扩展。非关系型数据库可以将数据拆分存储在不同机器上可以保存海量数据解决内存大小有限的问题。称为水平扩展。关系型数据库因为表之间存在关联关系如果做水平扩展会给数据查询带来很多麻烦。 1.2 认识Redis Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器是一个基于内存的键值型NoSQL数据库。 特征 键值key-value型value支持多种不同数据结构功能丰富。单线程每个命令具备原子性低延迟速度快基于内存、IO多路复用、良好的编码支持数据持久化支持主从集群、分片集群支持多语言客户端 二、Redis常见命令 Redis是典型的key-value数据库key一般是字符串而value包含很多不同的数据类型 2.1 Redis通用命令 通用指令是部分数据类型的都可以使用的指令常见的有 KEYS查看符合模板的所有keyDEL删除一个指定的keyEXISTS判断key是否存在EXPIRE给一个key设置有效期有效期到期时该key会被自动删除TTL查看一个KEY的剩余有效期 2.2 String类型 String类型也就是字符串类型是Redis中最简单的存储类型。 其value是字符串不过根据字符串的格式不同又可以分为3类 string普通字符串int整数类型可以做自增、自减操作float浮点类型可以做自增、自建操作 不管是哪种格式底层都是字节数组形式存储只不过是编码方式不同。字符串类型的最大空间不能超过512m。 2.2.1 String的常见命令 SET添加或者修改已经存在的一个String类型的键值对GET根据key获取String类型的valueMSET批量添加多个String类型的键值对MGET根据多个key获取多个String类型的valueINCR让一个整型的key自增1INCRBY让一个整型的key自增并指定步长例如incrby num 2 让num值自增2INCRBYFLOAT让一个浮点类型的数字自增并指定步长SETNX添加一个String类型的键值对前提是这个key不存在否则不执行SETEX添加一个String类型的键值对并且指定有效期 2.2.2 Key结构 Redis没有类型MySQL中Table的概念我们该如何区分不同类型的key呢 例如需要存储用户、商品信息到redis有一个用户id是1有一个商品id恰好也是1此时如果使用id作为key那就会冲突该怎么办 我们可以通过给key添加前缀加以区分不过这个前缀不是随便加的有一定的规范 Redis的key允许有多个单词形成层级结构多个单词之间用“:”隔开格式如下 项目名:业务名:类型:id这个格式并非固定也可以根据自己的需求来删除或添加词条。这样以来我们就可以把不同类型的数据区分开了。从而避免了key的冲突问题。 例如我们的项目名称叫 heima有user和product两种不同类型的数据我们可以这样定义key: user相关的keyheima:user:1product相关的keyheima:product:1 如果value是一个Java对象例如一个User对象则可以将对象序列化为JSON字符串后存储 KEYVALUEheima:user:1{“id”:1,“name”:“Jack”,“age”:21}heima:product:1{“id”:1,“name”:“小米11”,“price”:4999} 并且在Redis的桌面客户端中还会以相同前缀作为层级结构让数据看起来层次分明关系清晰 2.3 Hash类型 Hash类型也叫散列其value是一个无序字典类型于Java中的HashMap结构。 String结构是将对象序列化为JSON字符串后存储当需要修改对象某个字段时很不方便 Hash结构可以将对象中的每个字段独立存储可以针对单个字段做CRUD Hash常见的命令有 HSET key field value添加或者修改hash类型的key的field的值HGET key field获取一个hash类型key的field的值HMSET批量添加多个hash类型key的field的值HMGET批量获取多个hash类型key的field的值HGETALL获取一个hash类型的key中所有的field和valueHKEYS获取一个hash类型的key中所有的fieldHINCRBY让一个hash类型key的字段值自增并指定步长HSETNX添加一个hash类型的key的field值前提是这个field不存在否则不执行 2.4 List类型 Redis中的List类型与Java中的LinkedList类似可以看做是一个双向链表结构。既可以支持正向检索也可以支持反向检索。 特征 有序元素可以插入插入和删除速度快查询速度一般 常用来存储一个有序数据例如朋友圈点赞列表评论列表等。 List的常见命令有 LPUSH key element …向列表左侧插入一个或多个元素LPOP key移除并返回列表左侧的第一个元素没有则返回nullRPUSH key element …向列表右侧插入一个或多个元素RPOP key移除并返回列表右侧的第一个元素LRANGE key start end返回一段角标范围内的所有元素BLPOP和BRPOP与LPOP和RPOP类似只不过在没有元素时等待指定时间而不是直接返回null 2.5 Set类型 Redis的Set结构与Java中的HashSet类似可以看做是一个value为null的HashMap。因为也是一个hash表因此具备与HashSet类似的特征 无序元素不可重复查找快支持交集、并集、差集等功能 Set的常见命令有 SADD key member …向set中添加一个或多个元素SREM key member …移除set中的指定元素SCARD key返回set中元素的个数SISMEMBER key member判断一个元素是否存在于set中SMEMBERS获取set中的所有元素SINTER key1 key2 …求key1与key2的交集 例如两个集合s1和s2: 求交集SINTER s1 s2 求s1与s2的不同SDIFF s1 s2 2.6 SortedSet类型 Redis的SortedSet是一个可排序的set集合与Java中的TreeSet有些类似但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性可以基于score属性对元素排序底层的实现是一个跳表SkipList加hash表。 SortedSet具备下列特性 可排序元素不重复查询速度快 因为SortedSet的可排序特性经常被用来实现排行榜这样的功能。 SortedSet的常见命令有 ZADD key score member添加一个或多个元素到sorted set 如果已经存在则更新其score值ZREM key member删除sorted set中的一个指定元素ZSCORE key member : 获取sorted set中的指定元素的score值ZRANK key member获取sorted set 中的指定元素的排名ZCARD key获取sorted set中的元素个数ZCOUNT key min max统计score值在给定范围内的所有元素的个数ZINCRBY key increment member让sorted set中的指定元素自增步长为指定的increment值ZRANGE key min max按照score排序后获取指定排名范围内的元素ZRANGEBYSCORE key min max按照score排序后获取指定score范围内的元素ZDIFF、ZINTER、ZUNION求差集、交集、并集 注意所有的排名默认都是升序的如果要降序则在命令的Z后面添加REV即可例如 升序获取sorted set 中的指定元素的排名ZRANK key member降序获取sorted set 中的指定元素的排名ZREVRANK key memeber 三、Redis的Java客户端 Jedis和Lettuce这两个主要是提供了Redis命令对应的API方便我们操作Redis而SpringDataRedis又对这两种做了抽象和封装因此我们后期会直接以SpringDataRedis来学习。Redisson是在Redis基础上实现了分布式的可伸缩的java数据结构例如Map、Queue等而且支持跨线程的同步机制Lock、Semaphore等等比较适合用来实现特殊的功能需求。 3.1 Jedis客户端 3.1.1 快速入门 1引入依赖 !--jedis-- dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion3.7.0/version /dependency !--单元测试-- dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter/artifactIdversion5.7.0/versionscopetest/scope /dependency2建立连接 新建一个单元测试类内容如下 private Jedis jedis;BeforeEach void setUp() {// 1.建立连接// jedis new Jedis(192.168.150.101, 6379);jedis JedisConnectionFactory.getJedis();// 2.设置密码jedis.auth(123321);// 3.选择库jedis.select(0); }3测试 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); }4释放资源 AfterEach void tearDown() {if (jedis ! null) {jedis.close();} }3.1.2 连接池 Jedis本身是线程不安全的并且频繁的创建和销毁连接会有性能损耗因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。 package com.heima.jedis.util;import redis.clients.jedis.*;public class JedisConnectionFactory {private static JedisPool jedisPool;static {// 配置连接池JedisPoolConfig poolConfig new JedisPoolConfig();poolConfig.setMaxTotal(8);poolConfig.setMaxIdle(8);poolConfig.setMinIdle(0);poolConfig.setMaxWaitMillis(1000);// 创建连接池对象参数连接池配置、服务端ip、服务端端口、超时时间、密码jedisPool new JedisPool(poolConfig, 192.168.150.101, 6379, 1000, 123321);}public static Jedis getJedis(){return jedisPool.getResource();} }3.2 SpringDataRedis客户端 SpringData是Spring中数据操作的模块包含对各种数据库的集成其中对Redis的集成模块叫做SpringDataRedis。 提供了对不同Redis客户端的整合Lettuce和Jedis提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化支持基于Redis的JDKCollection实现 SpringDataRedis中提供了RedisTemplate工具类其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中 3.2.1 快速入门 1引入依赖 !--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/dependency2配置Redis spring:redis:host: 192.168.88.151port: 6379password: 030522lettuce:pool:max-active: 8 #最大连接max-idle: 8 #最大空闲连接min-idle: 0 #最小空闲连接max-wait: 100ms #连接等待时间3注入RedisTemplate 因为有了SpringBoot的自动装配我们可以拿来就用 SpringBootTest class RedisStringTests {Autowiredprivate RedisTemplate redisTemplate; }4编写测试 SpringBootTest class RedisStringTests {Autowiredprivate RedisTemplate edisTemplate;Testvoid testString() {// 写入一条String数据redisTemplate.opsForValue().set(name, 虎哥);// 获取string数据Object name stringRedisTemplate.opsForValue().get(name);System.out.println(name name);} }3.2.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名称目的是为了查询时实现自动反序列化。这会带来额外的内存开销。 3.2.3 StringRedisTemplate 为了节省内存空间我们可以不使用JSON序列化器来处理value而是统一使用String序列化器要求只能存储String类型的key和value。当需要存储Java对象时手动完成对象的序列化和反序列化。 因为存入和读取时的序列化及反序列化都是我们自己实现的SpringDataRedis就不会将class信息写入Redis了。 这种用法比较普遍因此SpringDataRedis就提供了RedisTemplate的子类StringRedisTemplate它的key和value的序列化方式默认就是String方式。 省去了我们自定义RedisTemplate的序列化方式的步骤而是直接使用 SpringBootTest public class RedisStringTest {Autowiredprivate StringRedisTemplate stringRedisTemplate;Testvoid testSaveUser() {//创建对象User user new User(汤姆,21);//手动序列化String json JSON.toJSONString(user);//写入数据stringRedisTemplate.opsForValue().set(user:200,json);//获取数据String jsonUser stringRedisTemplate.opsForValue().get(user:200);//手动反序列化User user1 JSON.parseObject(jsonUser, User.class);System.out.println(user1 user1);} }
http://wiki.neutronadmin.com/news/281117/

相关文章:

  • 网站备案号显示红色pythom+网站开发规范
  • 怎样查网站有没有备案超级采购小程序怎么注册
  • 沈阳德泰诺网站建设公司怎么样网站开发的技术简介
  • 网站首页菜单栏网站服务器的重要性
  • 万网网站备案多久前端响应式
  • 网站租服务器军事新闻最新消息军事新闻
  • wordpress站点logo设置html网页模板资源
  • 描述网站建设的具体流程网页传奇推荐
  • 重庆家居网站制作公司做字幕网站有哪些
  • 网站建设观点新能源汽车价格排名
  • 网站导航颜色哈尔滨h5模板建站
  • dw可以制作网站吗静态网页设计教程
  • 做游戏奖金不被发现网站亚洲风影视传媒有限公司辽宁
  • 花都电子商务网站建设做 爱 网站视频教程
  • 官方网站套餐网站关键词搜索排名
  • 做网站公司有什么出路dedecms医院网站
  • 中展建设股份有限公司网站微信网站制作价格
  • 建设一个班级网站的具体步骤深圳代理网络推广公司
  • 网站内链代码域名注册需要哪些条件
  • 网站设计公司 推荐昆明网站建设方案外包
  • 电子商务网站建设读书报告怎么申请小程序
  • 加若格网站做么样烟台企业网站开发
  • 宜宾县企业项目建设影响环境登记表网站开发者应用
  • 广州网站开发水平广州亦客网络如何自建网站做淘客
  • 微信公众号怎么推广百度seo详解
  • 青岛定制网站设计公司叫任何一个人一个小时做网站
  • 免费发布信息网站网址大全网络系统管理员
  • 娄底建设网站在线网站备份
  • 网站适合用angular做吗做门窗安装用哪些网站找生意
  • 怎么在国外的搜索网站做推广优良的网站邮箱服务器提供商isp