[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
原文地址:https://www.cnblogs.com/ytuan996/p/10648064.html