Redis字符串

简介:

String是Redis最基本的类型,可以理解成与 Memcached 一模一样的模型, 一个 key 对应一个 value (Memcached 是一个高性能的分布式内存对象缓存系统,用于动态web应用,以减轻数据库负载) String类型是 二进制安全 的。意味着 Redis 的 string 可以包含任何数据。比如 jpg图片,或者 序列化的对象 String 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 value 最多可以是512M

常用命令:

// 设置值与取值
set [key] [value] [EX seconds | PX milliseconds|KEEPTLL] [NX|XX]
get [key]
当设置的key已存在时,key的新增value会被覆盖

append [key] [value] 将给定的value追加到原来值的末尾
                    会返回新value的长度,如果key不存在,创建一个值为value的key
strlen [key] 获取key对应value的长度
setnx [key] [value] 只有在 key 不存在时, 才设置key的值 
                    返回0时,表示key已存在
                    
incr [key] 将给定key的值+1 / incrby [key] [step] 值加step
decr [key] 将给定key的值-1 / decrby [key] [step] 值减step

mset [key1] [value] [key2] [value] ... 同时设置一个或者多个key-value
mget [key1] [key2] ... 同时获得多个 value
msetnx [key1] [value] [key2] [value] ... 所有的key都不存在时,同时设置一个或者多个key-value ,否则设置不成功 (原子性)

getrange [key] [st] [ed] 获取key原value中[st,ed]的value
setrange [key] [st] [value] 在key原value中st的位置,以插入模式加入value

setex [key] [TTLTime] [value] 设置key-value的同时,设置过期时间
getset [key] [value] 将key的值设为value,并返回key的原值

线程:

incr是原子操作,不会被线程调度机制打断。

这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(线程切换)

  1. 在单线程中,能够在单条指令中完成的操作,都可以认为是原子操作,中断只能发生于指令之间。


  2. 在多线程中,不能被其他进程(线程)打断的操作就是原子操作。Redis单命令的原子性主要得益于Redis的单线程。


java的i++并非是原子操作
两个线程同时进行i++操作100次,结果会在2-200之间。

最大的情况(200)会是两个线程互不干扰。
最小的情况(2)两个线程的操作会被互相干扰,只有第一次和最后一次执行成功了。

本例中的i++并非为原子操作。

数据结构:

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

在Redis为字符串分配空间时,为字符串实际分配的空间capacity一般远高于实际字符串的长度。在字符串String最大长度为512M的限制下,当字符串长度小于1M时,扩容加倍现有的空间。如果超过1M,扩容时只会多扩容1M的空间。
上一篇
下一篇