[redis]基本数据类型
string
基本操作:
127.0.0.1:6379> strlen "Extreme Pizza" -- 字符的长度 (integer) 24 127.0.0.1:6379> strlen "Yummy Pizza" -- 不存在字符的长度 (integer) 0 127.0.0.1:6379> append "Extreme Pizza" "001001" -- 在已有字符的后面添加内容 (integer) 30 127.0.0.1:6379> get "Extreme Pizza" -- 再次查看 "300 Broadway,New York,NY001001" 127.0.0.1:6379> setrange "Extreme Pizza" 14 "Washton" -- 覆盖指定范围的字符 (指定位置开始到字符串末尾) (integer) 30 127.0.0.1:6379> get "Extreme Pizza" -- 再次查看 "300 Broadway,NWashton,NY001001"
更多细节:
set 键已经存在时,值会被覆盖
为此:setnx命令来了:存在键时返回0,不覆盖原来的值,不存在时才创建
127.0.0.1:6379> setnx "Extreme Pizza" "Chicago 1L" (integer) 0 127.0.0.1:6379> setnx "Yummy Pizza" "Chicago 1L" (integer) 1 127.0.0.1:6379> get "Extreme Pizza" "300 Broadway,NWashton,NY001001" 127.0.0.1:6379> get "Yummy Pizza" "Chicago 1L"
批量设置:
mset key value [key value] mget key value [key value]
Redis 的字符编码 : 1. int (64 位有符号的字符); 2. embstr(小于等于44字节,效率较高) ; 3. raw (大于44字节):
object encoding key -- 查看编码方式
list
基本操作:
127.0.0.1:6379> lpush favorite "java" "redis" "mysql" "tomcat" -- 存放系列数据 左端存放 (integer) 4 127.0.0.1:6379> lrange "favorite" 0 -1 -- 得到所有的数据 1) "tomcat" 2) "mysql" 3) "redis" 4) "java" 127.0.0.1:6379> rpush favorite "spring" "hadoop" "network" -- 从右端存放数据 (integer) 7 127.0.0.1:6379> lrange favorite 0 -1 --再查看 1) "tomcat" 2) "mysql" 3) "redis" 4) "java" 5) "spring" 6) "hadoop" 7) "network" 127.0.0.1:6379> linsert favorite before "java" "hbase" -- 指定位置插入 (integer) 8 127.0.0.1:6379> lrange favorite 0 -1 -- 在查看 1) "tomcat" 2) "mysql" 3) "redis" 4) "hbase" 5) "java" 6) "spring" 7) "hadoop" 8) "network" 127.0.0.1:6379> lindex "favorite" 5 -- 根据索引访问数据 "spring" 127.0.0.1:6379> lpop "favorite" --左删除一个元素 "tomcat" 127.0.0.1:6379> lpop "no-content" -- 删除一个不存在的元素 (nil) 127.0.0.1:6379> rpop "favorite" -- 右删除一个元素 "network"
Redis中列表的索引怎么定义的?假设列表中有N个元素,列表的索引从左到右 0 ~ n - 1; 从右到左-1 ~ -n,因此0 ~-1就是整个列表
更多细节:
lpop 和rpop都有其对应的blpop和brpop 阻塞版本,类似的可以弹出数据,但是在数据为空时,后者将使客户端阻塞。并设置阻塞时间,为0 标识永久等待。应用场景就是任务调度。
hash
127.0.0.1:6379> hmset "kyoto" "addr" "mission 8001" "phone" "1008611" "rating" 50 -- 设置hash值 OK 127.0.0.1:6379> hmget "kyoto" "addr" "phone" "rating" -- 得到hash值 1) "mission 8001" 2) "1008611" 3) "50" 127.0.0.1:6379> hexists "kyoto" "phone" -- 判断属性是否存在 (integer) 1 127.0.0.1:6379> hexists "kyoto" "hou" (integer) 0 127.0.0.1:6379> hgetall "kyoto" -- 取出所有hash值 1) "addr" 2) "mission 8001" 3) "phone" 4) "1008611" 5) "rating" 6) "50" 127.0.0.1:6379> hset "kyoto" "phone" "1001011" -- 修改属性的值 (integer) 0 127.0.0.1:6379> hget "kyoto" "phone" "1001011" 127.0.0.1:6379> hdel "kyoto" "rating" -- 删除属性 (integer) 1 127.0.0.1:6379> hgetall "kyoto" 1) "addr" 2) "mission 8001" 3) "phone" 4) "1001011"
同string,hash也有 hsetnx 命令用于只是覆盖不存在的字段
更多细节:
一个hash最多能容纳 2^32 - 1 个字段,字段过多时,执行hgetall 会阻塞redis服务器,此时我们可以使用 hscan命令
hscan key cursor [match pattern] [count number]
hash的编码方式:
ziplist:长度小于 hash-max-ziplist-entries 配置的值,且所有元素都小于 hash-max-ziplist-value的值大hash,采用此编码,对于较小的hash而言可以节省空间;
hashtable:默认的编码方式
set
基本操作:
127.0.0.1:6379> sadd "ytuan" "handsome" "humores" -- 添加元素 (integer) 2 127.0.0.1:6379> sismember "ytuan" "handsome" -- 判断元素是否在集合中 (integer) 1 127.0.0.1:6379> sismember "ytuan" "costl" -- 不再集合返回0 (integer) 0 127.0.0.1:6379> srem "ytuan" "humores" -- 删除元素 (integer) 1 127.0.0.1:6379> scard "ytuan" -- 获取元素中集合的数量 (integer) 1
与list和hash类似,set在执行sadd时,如果键不存在就会为我们创建一个空集合,同时,redis也会删除空集合中对于的 键
更多细节:
set中最多容纳 2^23 - 1个成员
smembers 返回集合中所有元素,当元素太多时会造成阻塞,建议使用 sscan替代,用法同hscan
计算相关的命令:
sunion,sunionstore 计算并集, sinter 和 sinterstore计算交集,sdiff 和sdiffstore 计算差集,带store表示将结果存储到一个指定的集合中,否则只是返回结果,不做存储。
Redis集合内部编码:
intset:对于元素都是整数,且个数小于配置中 set-max-intset-entries 选项(默认512),采用此编码,对于较小的集合比较节约空间。
hashtable:intset不适用时采用的编码
sortedset
127.0.0.1:6379> zadd ranking:restrants 100 "Olive" 23 "Chang's" 34 "Steakhouse" 45 "Lobster" 88 "Longhorn" -- 放入元素到有序集合中 (integer) 5 127.0.0.1:6379> zrevrange ranking:restrants 0 -1 withscores -- 得到所有元素及其权重 1) "Olive" 2) "100" 3) "Longhorn" 4) "88" 5) "Lobster" 6) "45" 7) "Steakhouse" 8) "34" 9) "Chang's" 10) "23" 127.0.0.1:6379> zincrby ranking:restrants 1 Lonster -- 增加指定元素的权重 "1" 127.0.0.1:6379> zscore ranking:restrants "Lonster" -- 查看某个元素的权重 "1" 127.0.0.1:6379> zscore ranking:restrants "Chang's" "23"
zunionstore 合并两个有序集合
zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
zinterstore 差集
zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
更多细节
redis sortedset 内部编码
ziplist:
skiplist:
HyperLogLog 优化集合类型
Geo 地理信息数据
Redis中所有的数据类型都是键值类型保存的,那么键的管理自然是十分重要的:
127.0.0.1:6379> dbsize -- 服务器中键个数 (integer) 6 127.0.0.1:6379> keys * -- 服务器中所有键 1) "favorite" 2) "kyoto" 3) "ytuan" 4) "Extreme Pizza" 5) "ranking:restrants" 6) "Yummy Pizza" 127.0.0.1:6379> scan 0 -- 扫描键 1) "0" 2) 1) "favorite" 2) "kyoto" 3) "Extreme Pizza" 4) "ytuan" 5) "ranking:restrants" 6) "Yummy Pizza" 127.0.0.1:6379> del "kyoto" -- 删除键 (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> scan 0 1) "0" 2) 1) "favorite" 2) "Extreme Pizza" 3) "ytuan" 4) "ranking:restrants" 5) "Yummy Pizza" 127.0.0.1:6379> exists "tuany" -- 判断键是否存在 (integer) 0 127.0.0.1:6379> exists "ytuan" (integer) 1 127.0.0.1:6379> type "ytuan" -- 键的类型 set 127.0.0.1:6379> rename "ytuan" "yangtuan" -- 重命名键 OK 127.0.0.1:6379> exists "yangtuan" (integer) 1 127.0.0.1:6379> exists "ytuan" (integer) 0