redis学习—redis数据结构和基本操作
redis是一种高级的key:value存储系统,其中value支持五种数据类型
-
字符串(strings)
-
散列(hashes)
-
列表(lists)
-
集合(sets)
-
有序集合(sorted sets)
-
哈希数据(hashes)
基本命令
-
keys *:查看所有key
-
type key:查看key类型
-
expire key seconds:设置某个键的过期时间
-
ttl key:查看key过期剩余时间,-2表示key已经不存在了
-
persist:取消key的过期时间,-1表示key存在,没有过期时间
-
exists key:判断key存在,存在返回1,否则0
-
del keys:删除key,可以删除多个
-
dbsize:计算key的数量
127.0.0.1:6379> set hobby prography OK 127.0.0.1:6379> expire hobby 10000 # 设置过期时间 (integer) 1 127.0.0.1:6379> ttl hobby # 查看键的过期时间 (integer) 9989 127.0.0.1:6379> persist hobby # 取消键hobby的过期时间 (integer) 1 127.0.0.1:6379> exists name # 判断键name是否存在 (integer) 1 127.0.0.1:6379> del hobby # 删除键值对hobby (integer) 1 127.0.0.1:6379> dbsize # 查看所有键值对数量 (integer) 4
二、strings的操作
strings类型的方法
-
set:设置key
-
get:获取key
-
append:追加string
-
mset:设置多个键值对
-
mget:获取多个键值对
-
del:删除key
-
incr:递增+1
-
decr:递减-1
使用方法实例
[root@superdesktop ~]# redis-cli 127.0.0.1:6379> set name ryxiong OK 127.0.0.1:6379> get name # 获取键name的值 "ryxiong" 127.0.0.1:6379> append name dsb # 给键name的值添加内容 (integer) 10 127.0.0.1:6379> get name # 获取键name的值 "ryxiongdsb" 127.0.0.1:6379> mset age 25 gender male # 设置多个键值对 OK 127.0.0.1:6379> mget name age gender # 获取多个键的值 1) "ryxiongdsb" 2) "25" 3) "male" 127.0.0.1:6379> set likes 1 OK 127.0.0.1:6379> incr likes # 点赞数+1 (integer) 2 127.0.0.1:6379> decr likes # 点赞数-1 (integer) 1
三、list类型
list类型方法
-
lpush:从列表左边插入元素,可以为多个
-
rpush:从列表右边插入元素,可以为多个
-
lrange:获取一定长度的元素 ,lrange key start stop
-
ltrim:截取一定长度列表,注意截取范围是前闭后闭
-
lpop:删除最左边一个元素
-
rpop:删除最右边一个元素
-
lpushx/rpushx:key存在则添加值,不存在不处理
list操作实例
127.0.0.1:6379> lpush queue 'alex' 'egon' 'wusir' # 插入一个list (integer) 3 127.0.0.1:6379> llen queue (integer) 3 127.0.0.1:6379> lrange queue 0 -1 # 查看list的所有元素 1) "wusir" 2) "egon" 3) "alex" 127.0.0.1:6379> rpush queue 'evaj' (integer) 4 127.0.0.1:6379> ltrim queue 0 2 # 截取列表的0-2,注意前后都闭合 OK 127.0.0.1:6379> lrange queue 0 -1 1) "wusir" 2) "egon" 3) "alex" 127.0.0.1:6379> lpop queue # 删除list左边第一个 "wusir" 127.0.0.1:6379> rpop queue # 删除list右边第一个 "alex" 127.0.0.1:6379> lrange queue 0 -1 1) "egon" 127.0.0.1:6379> lpushx queue 'dsb' # 有dsb不添加,没有就添加 (integer) 2 127.0.0.1:6379> lrange queue 0 -1 1) "dsb" 2) "egon"
四、sets集合类型
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。
sets类型的方法:
-
sadd/srem:添加/删除 元素
-
sismember:判断是否为set的一个元素
-
smembers:返回集合所有的成员
-
sdiff:返回一个集合和其他集合的差异
-
sinter:返回几个集合的交集
-
sunion:返回几个集合的并集
sets操作实例
127.0.0.1:6379> sadd zoo wusir egon yuanhao # 设置一个集合zoo (integer) 3 127.0.0.1:6379> sadd zoo2 egon evaj alex # zoo2 (integer) 3 127.0.0.1:6379> sismember zoo egon # 判断egon是否是zoo的成员 (integer) 1 127.0.0.1:6379> sadd zoo chao # 给zoo添加一个成员chao (integer) 1 127.0.0.1:6379> smembers zoo # 查看zoo的所有成员 1) "chao" 2) "yuanhao" 3) "egon" 4) "wusir" 127.0.0.1:6379> sdiff zoo zoo2 # 求zoo和zoo2的差集 1) "wusir" 2) "yuanhao" 3) "chao" 127.0.0.1:6379> sinter zoo zoo2 # 求zoo和zoo2的交集 1) "egon" 127.0.0.1:6379> sunion zoo zoo2 # 求zoo和zoo2的并集 1) "chao" 2) "yuanhao" 3) "egon" 4) "alex" 5) "evaj" 6) "wusir"
五、有序集合
有序集合都是以z开头,一般用来保存需要排序的数据,如排行榜,成绩,工资等。
实例,排序学生的成绩
127.0.0.1:6379> ZADD mid_test 70 "alex" # 添加alex 70到成绩的有序集合中 (integer) 1 127.0.0.1:6379> ZADD mid_test 80 "wusir" (integer) 1 127.0.0.1:6379> ZADD mid_test 99 "yuyu"
排行榜,zreverange倒序,zrange正序。
127.0.0.1:6379> ZREVRANGE mid_test 0 -1 withscores 1) "yuyu" 2) "99" 3) "wusir" 4) "80" 5) "xiaofneg" 6) "75" 7) "alex" 8) "70" 127.0.0.1:6379> ZRANGE mid_test 0 -1 withscores 1) "alex" 2) "70" 3) "xiaofneg" 4) "75" 5) "wusir" 6) "80" 7) "yuyu" 8) "99"
移除有序集合mid_test的成员xiaofeng
127.0.0.1:6379> ZREM mid_test xiaofneg (integer) 1 127.0.0.1:6379> ZRANGE mid_test 0 -1 withscores 1) "alex" 2) "70" 3) "wusir" 4) "80" 5) "yuyu" 6) "99"
返回有序集合mid_test的基数
127.0.0.1:6379> ZCARD mid_test (integer) 3
返回成员的score值
127.0.0.1:6379> ZSCORE mid_test alex "70"
六、哈希数据结构
哈希结构就是 :k1 -> k1 : v1 如同字典 套字典 { k1 : { k2: v2 } } ,取出v2 必须 k1,取出k2
hashes即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。
hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
-
hset:设置散列值
-
hget:获取散列值
-
hmset:设置多对散列值
-
hmget:获取多对散列值
-
hsetnx:如果散列已经存在,则不设置(防止覆盖key)
-
hkeys:返回所有keys
-
hvals:返回所有values
-
hlen:返回散列包含域(field)的数量
-
hdel:删除散列指定的域(field)
-
hexists:判断是否存在
哈希数据使用实例
127.0.0.1:6379> hset ryxiong name ryxiong (integer) 1 127.0.0.1:6379> hset ryxiong age 18 (integer) 1 127.0.0.1:6379> hset ryxiong gender male (integer) 1 127.0.0.1:6379> hget ryxiong name "ryxiong" 127.0.0.1:6379> hmset haiqing name haiqing gender female OK 127.0.0.1:6379> hkeys ryxiong 1) "name" 2) "age" 3) "gender" 127.0.0.1:6379> hvals ryxiong 1) "ryxiong" 2) "18" 3) "male" 127.0.0.1:6379> hmget ryxiong name age 1) "ryxiong" 2) "18" 127.0.0.1:6379> hsetnx ryxiong tall 175 (integer) 1 127.0.0.1:6379> hlen ryxiong (integer) 4 127.0.0.1:6379> hdel ryxiong tall (integer) 1 127.0.0.1:6379> hkeys ryxoing (empty list or set) 127.0.0.1:6379> hlen ryxiong (integer) 3 127.0.0.1:6379> hkeys ryxiong 1) "name" 2) "age" 3) "gender" 127.0.0.1:6379> hexists ryxiong name