3.2Redis字符串

3.2.1简介

• String是Redis是最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
• String类型是二进制安全的,意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
• String类型是Redis最基本的数据类型,一个Redis字符串value最多可以是512M

3.2.2常用命令

• set <key>添加键值对
 NX:当前数据库中key不存在时,可以将key-value添加数据库
 XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
 EX:key的超时秒数
 PX:key的超时毫秒数,与EX互斥• get <key> 查询对应键值
• append <key><value> 将给定的<value>追加到原值的末尾
• strlen <key>获得值的长度
• setnx <key>只有在key不存在时 设置key的值
• incr <key>
 将key中储存的数字值增1
 只能对数字值操作,如果为空,新增值为1• decr<key>
 将key中储存的数字值减1
 只能对数字值操作,如果为空,新增值为-1• incrby/decrby<key><步长>将key中存储的数字值增减,自定义步长

原子性 INCR key(对存储在指定key的数值执行原子的加1操作)

所谓原子操作是指不会被线程调度机制打断的操作
 这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程)
 (1)在单线程中,能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于指令之间
 (2)在多线程中,不能被其他进程(线程)打断的操作就叫原子操作
 Redis单命令的原子性主要得益于Redis的单线程• mset<key1><value1><key2><value2>
 同时设置一个或多个key-value对• mget<key1><key2><key3>
• 同时获取一个或者多个value
• msetnx<key1><value1><key2><value2>
• 同时设置一个或多个key-value对,当且仅当所有给定key都不存在
 ** 原子性,有一个失败则都失败**• getrange <key><起始位置><结束位置>
 获得值的范围,类似于java中的substring,前包,后包• setex<key><过期时间><value>
 设置键值的同时,设置过期时间,单位秒• getset<key><value>
 以新换旧,设置了新值同时获得旧值

3.2.3数据结构

String的数据结构为简单动态字符串,是可以修改字符串,内部结构实现上类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配

内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。
当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间,需要注意的是字符串最大长度为512M.