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

成都网站建设开网易企业邮箱

成都网站建设开,网易企业邮箱,wordpress通过微信投稿,益保网做推广网站吗?Redis字符串(String) 4.1 Redis 中 String 的简介 String 是Redis五种最基本的类型之一#xff0c;在使用时可以理解成与Memcached一模一样的类型#xff0c;一个key对应一个value。 String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图片或…Redis字符串(String) 4.1 Redis 中 String 的简介 String 是Redis五种最基本的类型之一在使用时可以理解成与Memcached一模一样的类型一个key对应一个value。 String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。 String 类型是 Redis 最基本的数据类型一个 Redis 中字符串 value 最多可以是 512M。 4.2 常用命令 set key value 添加键值对 get key查询对应键值 127.0.0.1:6379 set k1 v1 OK 127.0.0.1:6379 get k1 v1append key value 将给定的 value 追加到原值的末尾 127.0.0.1:6379 append k1 100 (integer) 5 127.0.0.1:6379 get k1 v1100strlen key获得值的长度 127.0.0.1:6379 strlen k1 (integer) 5setnx key value只有在 key 不存在时设置 key 的值而key存在时不对key对应的value值作修改之前的 set 命令则会覆盖原来的值 127.0.0.1:6379 set k1 v1 OK 127.0.0.1:6379 set k2 v2 OK 127.0.0.1:6379 keys * 1) k2 2) k1 127.0.0.1:6379 set k1 v110 OK 127.0.0.1:6379 get k1 v110 127.0.0.1:6379 get k2 v2 127.0.0.1:6379 setnx k2 v210 (integer) 0 127.0.0.1:6379 get k2 v2incr key将 key 中储存的数字值增1只能对数字值操作如果为空新增值为1 127.0.0.1:6379 set k3 1 OK 127.0.0.1:6379 incr k3 (integer) 2 127.0.0.1:6379 get k3 2 127.0.0.1:6379 incr k3 (integer) 3 127.0.0.1:6379 incr k3 (integer) 4 127.0.0.1:6379 get k3 4decr key将 key 中储存的数字值减1只能对数字值操作如果为空新增值为-1 127.0.0.1:6379 decr k3 (integer) 3 127.0.0.1:6379 get k3 3 127.0.0.1:6379 decr k3 (integer) 2 127.0.0.1:6379 decr k3 (integer) 1 127.0.0.1:6379 get k3 1incrby/decrby key 步长将 key 中储存的数字值增减。自定义步长。 127.0.0.1:6379 incrby k3 5 (integer) 6 127.0.0.1:6379 incrby k3 5 (integer) 11 127.0.0.1:6379 incrby k3 5 (integer) 16 127.0.0.1:6379 get k3 16 127.0.0.1:6379 decrby k3 3 (integer) 13 127.0.0.1:6379 decrby k3 3 (integer) 10 127.0.0.1:6379 get k3 10注意incr key 是一种原子操作所谓原子操作是指不会被线程调度机制打断的操作这种操作一旦开始就一直运行到结束中间不会有任何 context switch 切换到另一个线程。 1在单线程中 能够在单条指令中完成的操作都可以认为是原子操作因为中断只能发生于指令之间。 2在多线程中不能被其它进程线程打断的操作就叫原子操作。 Redis单命令的原子性主要得益于Redis的单线程。 案例 java中的i是否是原子操作不是java是多线程的 i 0两个线程分别对i进行100次值是多少 2~200 i 的步骤1取值23赋值 Thread-0Thread-1i0……ii99ii1i1ii100ii2 mset key1 value1 key2 value2 .....连续设置多个键值对 mget key1 key2 key3 .....同时获取一个或多个 value 127.0.0.1:6379 flushdb OK 127.0.0.1:6379 mset k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379 mget k1 k2 k3 1) v1 2) v2 3) v3msetnx key1 value1 key2 value2 ..... 同时设置一个或多个 key-value 对当且仅当所有给定 key 都不存在。且 msetnx 有一个失败其他都是注入无效的 127.0.0.1:6379 msetnx k1 v110 k4 v110 (integer) 0 127.0.0.1:6379 mget k1 k2 k3 k4 1) v1 2) v2 3) v3 4) (nil) 127.0.0.1:6379 msetnx k1 v110 (integer) 0 127.0.0.1:6379 mget k1 k2 k3 k4 1) v1 2) v2 3) v3 4) (nil) 127.0.0.1:6379 msetnx k4 v110 (integer) 1 127.0.0.1:6379 mget k1 k2 k3 k4 1) v1 2) v2 3) v3 4) v110getrange key 起始位置 结束位置 获得值的范围类似java中的substring前包后包 127.0.0.1:6379 getrange k4 0 -1 v110 127.0.0.1:6379 getrange k4 0 2 v11setrange key 起始位置 value用 覆写所储存的字符串值从起始位置开始(索引从0开始)。 127.0.0.1:6379 getrange k4 0 -1 v110 127.0.0.1:6379 setrange k4 1 000 (integer) 4 127.0.0.1:6379 get k4 v000setex key 过期时间 value设置键值的同时设置过期时间单位秒。 127.0.0.1:6379 setex k5 40 v5 OK 127.0.0.1:6379 ttl k5 (integer) 35 127.0.0.1:6379 ttl k5 (integer) 32 127.0.0.1:6379 ttl k5 (integer) 1 127.0.0.1:6379 ttl k5 (integer) -2getset key value以新换旧设置了新值同时获得旧值。 127.0.0.1:6379 get k1 v1 127.0.0.1:6379 getset k1 v111 v1 127.0.0.1:6379 get k1 v1114.3 底层逻辑 String类型的数据结构存储方式有三种int、raw、embstr。那么这三种存储方式有什么区别呢 4.3.1 int Redis中规定假如存储的是 整数型值比如 set k1 1 这样的类型就会使用 int的存储方式进行存储在redisObject的ptr属性中就会保存该值。 4.3.2 SDS 结论先行假如存储的字符串是一个字符串值并且长度大于44个字节就会使用 SDSsimple dynamic string 方式进行存储并且encoding设置为raw若是字符串长度小于等于44个字节就会将encoding改为emdstr来保存字符串。 127.0.0.1:6379 set k1 qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwert OK 127.0.0.1:6379 debug object k1 Value at:0x7f70b1ca0dc0 refcount:1 encoding:raw serializedlength:21 lru:16311423 lru_seconds_idle:4 127.0.0.1:6379 set k2 qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwer OK 127.0.0.1:6379 debug object k2 Value at:0x7f70b1c22d80 refcount:1 encoding:embstr serializedlength:21 lru:16311924 lru_seconds_idle:2k1 和 k2 只差了一个字符存储形式 encoding 就发生了变化。对于较长的k1其 encoding 为 raw 对于较短的 k2其 encoding 为 embstr。 在了解存储格式的区别之前首先了解下RedisObject结构体。也对上面的结构体做解释。 所有的 Redis 对象都有一个 Redis 对象头结构体 struct RedisObject { int4 type; // 4bits 类型int4 encoding; // 4bits 存储格式int24 lru; // 24bits 记录LRU信息int32 refcount; // 4bytes void *ptr; // 8bytes64-bit system } robj;不同的对象具有不同的类型 type 占4个bit。 同一个类型的 type 会有不同的存储形式 encoding也占4个bit。 为了记录对象的 LRU 信息使用了 24 个 bit 的 lru 来记录 LRU 信息。 每个对象都有个引用计数 refcount当引用计数为零时对象就会被销毁内存被回收。 ptr 指针将指向对象内容 (body) 的具体存储位置。 所以一个 RedisObject 对象头共需要占据 16 字节的存储空间。 再看一下RedisObject的10种存储格式——encoding //这两个宏定义申明是在server.h文件中 #define OBJ_ENCODING_RAW 0 /* Raw representation */ #define OBJ_ENCODING_INT 1 /* Encoded as integer */ #define OBJ_ENCODING_HT 2 /* Encoded as hash table */ #define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */ #define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */ #define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */ #define OBJ_ENCODING_INTSET 6 /* Encoded as intset */ #define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist */ #define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */ #define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */而Redis 的字符串共有两种存储方式在长度特别短时使用 emb 形式存储 (embedded)当长度超过 44 时使用 raw 形式存储。那么为什么是 44 字节呢 embstr 存储形式是这样一种存储形式它将 RedisObject 对象头和 SDS 对象连续存在一起使用 malloc 方法一次分配。 而 raw 存储形式不一样它需要两次 malloc两个对象头在内存地址上一般是不连续的。 在字符串比较小时SDS 对象头的大小是capacity3——SDS结构体的内存大小至少是 3。意味着分配一个字符串的最小空间占用为 19 字节 (163)。 如果总体超出了 64 字节Redis 认为它是一个大字符串不再使用 emdstr 形式存储而该用 raw 形式。而64-19-结尾的**\0**所以empstr只能容纳44字节。 4.3.3 SDS的扩容策略和扩容 SDS_MAX_PREALLOC的容量大小定义在sds.h文件中默认是 1024 * 1024也就是1MB。 //扩容分配策略 newlen (lenaddlen); // 如果新长度小于最大预分配长度则分配扩容为2倍 // 如果新长度大于最大预分配长度则仅追加SDS_MAX_PREALLOC长度 if (newlen SDS_MAX_PREALLOC)newlen * 2; elsenewlen SDS_MAX_PREALLOC;通过源代码可以看出扩容策略是字符串在长度小于 SDS_MAX_PREALLOC 之前扩容空间采用加倍策略也就是保留 100% 的冗余空间。当长度超过 SDS_MAX_PREALLOC 之后为了避免加倍后的冗余空间过大而导致浪费每次扩容只会多分配 SDS_MAX_PREALLOC大小的冗余空间。 4.5 String类型应用存储图片 1首先要把上传得图片进行编码这里写了一个工具类把图片处理成了Base64得编码形式具体得实现代码如下 /*** 将图片内容处理成Base64编码格式* param file* return*/ public static String encodeImg(MultipartFile file) {byte[] imgBytes null;try {imgBytes file.getBytes();} catch (IOException e) {e.printStackTrace();}BASE64Encoder encoder new BASE64Encoder();return imgBytesnull?null:encoder.encode(imgBytes ); }2第二步就是把处理后的图片字符串格式存储进Redis中实现得代码如下所示 /*** Redis存储图片* param file* return*/ public void uploadImageServiceImpl(MultipartFile image) {String imgId UUID.randomUUID().toString();String imgStr ImageUtils.encodeImg(image);redisUtils.set(imgId , imgStr);// 后续操作可以把imgId存进数据库对应的字段如果需要从redis中取出只要获取到这个字段后从redis中取出即可。 }
http://www.yutouwan.com/news/394335/

相关文章:

  • 江西网站开发哪家好页面素材图片
  • 深圳极速网站建设报价彩票网站建设多少钱
  • 建设网站专业公司哪家好北京建设工程交易网
  • 动漫网站开发毕业设计机关网站建设工程总结
  • 网站描述怎么修改吗怎么做微信辅助的网站
  • 郑州网站建设中国建设建设银行企业网站需要什么功能
  • 建站软件有哪些功能南通网络科技的公司网站
  • 公司网站要什么做wordpress如何分类栏
  • 南通做企业网站专业建站服务公司
  • 哪家公司做网站比较好九江网站建设推广
  • 网站建设店wordpress站点制作
  • 网站前台模块包括什么网络营销是传销吗
  • 如何创建个人网站设计素材网站线上
  • 网址站点异常怎么解决做h5的网站
  • 查询邮箱注册网站青岛网站制作网站
  • 化妆品网站建设目的wordpress电影页面代码
  • 网站架设教程商标注册网官方查询
  • 网站站群优化焦作网站建设哪家便宜
  • 如何创建一个网站小米R2D安装wordpress
  • 山东省专业群建设网站什么网站做的比较好
  • 高唐做网站建设的公司求个网站谢谢啦
  • 建站公司坡头网站建设公司
  • 一加网站开发怎么在广告联盟接广告
  • 珠海网站搭建导航网站开发工具
  • 四川省建设人才网站2018承德企业网站建设公司
  • 怎么盗取网站计算机应用技术(网站开发)
  • 福州 福马路 网站建设响应式相册网站模板
  • 张槎网站建设制作外贸建站服务器怎么选
  • 做网站接广告赚钱么wordpress本地
  • 怎么样增加网站权重网站seo排名优化工具