redis常见的数据类型

redis常见的5种数据类型分别是:
* string(字符串)
* list(链表)
* set(集合)
* sorted set(有序集合)
* hash(散列or字典)

在介绍这5种类型前,我们先来介绍一下redis的 全局操作指令

keys my*   获取当前数据库中所有以my开头的key
exists mykey   若不存在,返回0;存在返回1
select 0   打开 ID 为 0 的数据库
ttl mykey   查看存货时间还剩下多少秒
type mykey   返回mykey对应的值的类型
randomkey   返回数据库中的任意键

flushdb   清空当前选择的数据库
del mykey mykey2   删除了两个 Keys

move mysetkey 1   将当前数据库中的 mysetkey 键移入到 ID 为 1 的数据库中
rename mykey mykey1   将 mykey 改名为 mykey1
renamenx oldkey newkey   如果 newkey 已经存在,则无效
expire mykey 100   将该键的超时设置为 100 秒
persist mykey  将该 Key 的超时去掉,变成持久化的键
 
了解完redis的全局操作指令,接下来让我们一起学习一下这5种数据类型。

1、string类型:
string是简单的 key-value 键值对,value 可以是 String,也可以是数字。String在redis内部存储默认就是一个字符串,当遇到incr,decr,incrby,decrby等命令操作时会转成数值型进行计算。
相关操作命令:
增:
set name brian   为键设置新值,并覆盖原有值(名字:brian)
getset age 20   设值取值同时进行(年龄:20)
setex mykey 10 hello   设置指定 Key 的过期时间为10秒,在存活时间可以获取value
setnx mykey hello   若该键不存在,则为键设置新值
mset key1 alisa key2 brian   批量设置键
删:
del name   删除已有键(删除key为name的键值)
查:
exists key1       判断该键(key1)是否存在,存在返回 1,否则返回0
get key1     获取Key对应的value
strlen key1     获取指定 Key 的字符长度
ttl key1       查看一下指定 Key 的剩余存活时间(秒数)
mget key1 key2   批量获取键
改:
append key1 hello   若该键并不存在,返回当前 Value 的长度,若该键已经存在,返回追加后 value的长度
incr key1   值增加1,若该key不存在,创建key,初始值设为0,增加后结果为1
decrby key1  5   值减少5
setrange mykey 10 ab     把第11和12个字节,替换为ab, 超过value长度,自动补0


2、hash类型:
我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器,其中Value内部实际就是一个HashMap,所以该类型非常适合于存储值对象的信息,当Hash的成员比较少时,Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,类似php里面的关联数组,形成一个这样的数据:$userInfo = array("name"=>brian)
应用场景:用于存储有多个用户及对应的用户信息,用户ID为key,将用户信息序列化为比如json格式做为value进行保存
常用命令:
增:
hset myhash field1 a   若字段field1不存在,创建该键及与其关联的Hashes中,key为field1,并设value为s若字段field1存在,旧值被覆盖                  
hsetnx myhash field1 a     若字段field1不存在,创建该键及与其关联的Hashes中,key为field1 ,并设value为s,若字段field1存在,则无效
hmset myhash field1 "hello" field2 "world   一次性设置多个字段
删:
hdel myhash field1   删除 myhash 键中字段名为 field1 的字段
del myhash   删除键
查:
hget myhash field1   获取键为 myhash,字段为 field1 的值
hmget myhash field1 field2 field3   一次性获取多个字段
hgetall myhash   返回 myhash 键的所有字段及其值
hkeys myhash   获取myhash 键中所有字段的名字
hvals myhash   获取 myhash 键中所有字段的值
hlen myhash   获取myhash键的字段数量
hexists myhash field1     判断 myhash 键中是否存在字段名为 field1 的字段
改:
hincrby myhash field 1  给field的值加1

3、list类型:
简单的说就是一个链表(或者说是一个队列),可以从头部或尾部向Redis列表添加元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。它的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。List中可以包含的最大元素数量超过40亿个元素。
应用场景:
a.使用Redis的list类型可以实现一个简单的轻量级消息队列。
b.统计数据,如统计最近登录系统的10个用户(使用mysql:select * from user order by login_time_ desc limit 10; 使用redis:创建一个list,从链表的左侧加入用户主键id,当里面的的单元超过10个,只需要吧最右侧的那个单元弹出即可)
相关操作命令:
增(lpush:left push):
lpush mylist a b   若key不存在,创建该键及与其关联的List,依次插入a ,b, 若List类型的key存在,则插入value中,顺序为:b,a
lpushx mylist a   若key不存在,此命令无效,若key存在,则将a插入value中
rpush mylist a b 在链表尾部先插入a,再插入b,顺序为:a,b
linsert mylist before a b   在 a 的前面插入新元素 b
linsert mylist after a b     在a 的后面插入新元素 b
rpop mylist 在链表的左侧弹出第一个数据
rpoplpush mylist1 mylist2   将mylist1的尾部元素弹出,再插入到mylist2的头部(原子性的操作)
删:
del mylist   删除已有键 
lrem mylist 2 a   从头部开始找,按先后顺序,值为a的元素,删除数量为2个,若存在第3个,则不删除
ltrim mylist 0 2   从头开始,索引为0,1,2的3个元素,其余全部删除
查:
lrange mylist 0 -1   取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
lrange mylist 0 2     从头开始,取索引为0,1,2的元素
lrange mylist 0 0     从头开始,取第一个元素,从第0个开始,到第0个结束
lpop mylist           获取头部元素,并且弹出头部元素,出栈
lindex mylist 6       从头开始,获取索引为6的元素 若下标越界,则返回nil
改:
lset mylist 1 e   从头开始, 将索引为1的元素值,设置为新值 e,若索引越界,则返回错误信息


4、set类型:
Set类型看作为没有排序,无重复值的字符集合,类似数学领域中的集合概念,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝,且Redis也提供了针对集合的求交集、并集、差集等操作。set的内部实现是一个 value永远为null的HashMap,并可以通过计算hash的方式来快速排重。
应用场景:
多用于社交类型的网站,例如实现好友的推荐、共同的好友、你可能认识的人....
相关操作指令:

sadd myset a b c  若myset不存在,创建该键及与其关联的set,依次插入a ,b,若myset存在,则插入value中,若a在myset中已经存在,则只插入了b 和 c 两个新成员

spop myset   移除并返回集合中的一个随机元素
srem myset a b c 删除指定的的元素,如若a不存在, 只删除b c ,并返回2

sismember myset a     判断 a 是否已经存在,返回值为 1 表示存在,返回 0 表示不存在
scard myset     获取Set 集合中元素的数量
sinter myset1 myset2 myset3   求3个集合中都有的元素(交集)
sunion myset1 myset2 myset3   获取3个集合中的成员的并集
sdiff myset1 myset2   求两个集合的补集

smove myset1 myset2 a     将a从 myset1 移到 myset2,

5、Sorted-Sets类型
Redis有序集合类似set集合,不同的是这种集合是有序的。一个有序集合的每个成员带有分数(score)或者说是权重(1-9、a~z),用于进行从小到大排序。这种集合的成员是唯一的,但是分数(score)却是可以重复的
相关操作指令:

zadd myzset 2 alisa 3 brian   添加两个权重分别是 2 和 3 的两个成员

zrem myzset alisa brian   删除指定的元素,返回删除的数量

zcard myzset     获取 myzset 键中成员的数量
zcount myzset 1 4   获取权重在[1,4]之间的元素的数量
zscore myzset brian   获取元素brian的分数
zrank myzset brian   获取成员brian在Sorted-Set中的位置索引值。0表示第一个位置
zrange myzset 0 -1 WITHSCORES   返回所有成员和分数,如果不加WITHSCORES,只返回成员

zincrby myzset 2 brian   将成员 brian 的分数增加 2,并返回该成员更新后的分数(权重)


相关学习网站:http://www.runoob.com/redis/redis-tutorial.html

未完待续.......

猜你喜欢

转载自blog.csdn.net/brianwey/article/details/77104474
今日推荐