5.关于redis数据类型
五大数据类型
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
Redis-key
#EXISTS name 判断当前key是否存在
#move name 1 //移除当前key,其中1带包当前数据库
127.0.0.1:6379[3]> EXPIRE name 10 //设置key过期时间
127.0.0.1:6379[3]> ttl name //ttl 查看当前key的剩余时间
127.0.0.1:6379[3]> type name //查看当前key的具体类型



String
127.0.0.1:6379> APPEND key1 "hello" //往某个key中追加字符串,如果当前key不存在,就相当于set一个key
127.0.0.1:6379> STRLEN key1 //获取字符串的长度

i++
127.0.0.1:6379> incr views //自增1
127.0.0.1:6379> decr views //自减1
127.0.0.1:6379> INCRBY views 10 //可以设置步长 指定增量
127.0.0.1:6379> DECRBY views 10 //
获取字符串范围(range)
127.0.0.1:6379> GETRANGE key1 0 3 //截取字符串[0,3]
127.0.0.1:6379> GETRANGE key1 0 -1 //-1获取全部字符串

替换replace
127.0.0.1:6379> SETRANGE key2 1 xx //替换指定位置开始的字符串

setex (set with expire)//设置过期时间
setnx (set if not exist)//不存在设置(在分布式锁中使用),如果key不存在,则创建新key,若key存在,则创建失败

mset k1 v1 k2 v2
mget
127.0.0.1:6379> msetnx k1 v1 k4 v4 //msetnx 是一个原子性操作,要么一起成功要么一起失败


#对象
set user:1 {name:zhang,age:3}//设置user:1对象为一个json字符串来保存一个对象
user:{id}:{filed}

getset 先get在set
127.0.0.1:6379> getset db redis #如果不存在值,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
List
127.0.0.1:6379> LPUSH list one #将一个值或多个值插入到列表头部(左)
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUsh list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 1 #通过区间获得具体的值
1) "three"
2) "two"
127.0.0.1:6379> Rpush list right #将一个值或多个值插入到列表尾部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
##############################
LPOP
RPOP
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> Lpop list #移除列表的第一个元素
"three"
127.0.0.1:6379> Rpop list #移除列表中的最后一个元素
"right"
####################################
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 0 #
"two"
127.0.0.1:6379> lindex list 1 #通过下标获取list中的某一个值
"one"
#####################################
Llen
127.0.0.1:6379> Lpush list one
(integer) 1
127.0.0.1:6379> Lpush list two
(integer) 2
127.0.0.1:6379> Lpush list three
(integer) 3
127.0.0.1:6379> Llen list #返回列表的长度
(integer) 3
#####################################
127.0.0.1:6379> Lpush list one
(integer) 1
127.0.0.1:6379> Lpush list two
(integer) 2
127.0.0.1:6379> Lpush list three
(integer) 3
127.0.0.1:6379> Llen list
(integer) 3
127.0.0.1:6379> Lpush list three
(integer) 4
127.0.0.1:6379> lrem list 1 one #移除list集合中指定个数的vaule,经确匹配
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
#####################################
trim list截断
127.0.0.1:6379> Rpush mylist "hello1"
(integer) 1
127.0.0.1:6379> Rpush mylist "hello2"
(integer) 2
127.0.0.1:6379> Rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> Rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2 #通过下表截图指定的长度,这个list已经改变了
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello2"
2) "hello2"
###################################
rpoplpush #移除列表的最后一个元素,将它移动到新的列表中
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist #移除列表的最后一个元素,将它移动到新的列表中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1 #查看原来的列表
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1 #查看目标列表中确实存在该值
1) "hello2"
####################
127.0.0.1:6379> EXISTS list #判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item #如果不存在列表更新就会报错
(error) ERR no such key
127.0.0.1:6379> lpush list "value1"
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item #如果存在,更新当前下标的值
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
##############
linsert #将某一个具体的值插入到列表中某个元素的前面或者后面
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "world"
(integer) 2
127.0.0.1:6379> linsert mylist before "world" "other"
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
##########################################
set(集合)
127.0.0.1:6379> sadd myset "hello" #set集合中添加集合
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> SMEMBERS myset #查看指定set的所有值
1) "world"
2) "hello"
127.0.0.1:6379> SISMEMBER myset hello #判断某一个值是否在set中
(integer) 1
127.0.0.1:6379> SISMEMBER myset test
(integer) 0
127.0.0.1:6379> scard myset #获取set集合中的内容元素个数
(integer) 3
127.0.0.1:6379> scard myset #移除set集合中的指定元素
(integer) 3
127.0.0.1:6379> srem meyset "hello"
(integer) 0
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1) "world"
2) "hello"
3) "hello2"
set 是无序不重复集合 抽随机
127.0.0.1:6379> SRANDMEMBER myset #随机抽选出一个元素
"hello2"
127.0.0.1:6379> SRANDMEMBER myset
"world"
127.0.0.1:6379> SRANDMEMBER myset 2 #随机抽选指定个数的元素
1) "world"
2) "hello"
移除指定的key,随机删除指定的key
127.0.0.1:6379> SMEMBERS myset
1) "world"
2) "hello"
3) "hello2"
127.0.0.1:6379> spop myset #随机删除set集合中的元素
"world"
127.0.0.1:6379> spop myset
"hello2"
127.0.0.1:6379> SMEMBERS myset
1) "hello"
将一个指定的值移动到另一个set集合中
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "world!!"
(integer) 1
127.0.0.1:6379> sadd myset "test2"
(integer) 1
127.0.0.1:6379> sadd myset2 "test3"
(integer) 1
127.0.0.1:6379> smove myset myset2 "test2" #
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "world"
2) "world!!"
3) "hello"
127.0.0.1:6379> SMEMBERS myset2
1) "test3"
2) "test2"
127.0.0.1:6379> clear
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> SDIFF key1 key2 #差集
1) "a"
2) "b"
127.0.0.1:6379> SINTER key1 key2 #交集
1) "c"
127.0.0.1:6379> SUNION key1 key2 #并集
1) "b"
2) "a"
3) "d"
4) "c"
5) "e"
微博,A用户将所有关注的人放在一个set集合中,将它的粉丝以放在一个集合中,比如共同关注
#################################################
hash(哈希)Map集合 key-map集合 hash本质跟string类型没有太大区别 还是一个key-vaule 只是这个值一个map集合
set myhash filedhello
127.0.0.1:6379> hset myhash field1 hello #set一个具体key-vaule
(integer) 1
127.0.0.1:6379> hget myhash field1 #获取一个字段值
"hello"
127.0.0.1:6379> hmset myhash field1 hello1 field2 world #set多个key-vaule
OK
127.0.0.1:6379> hmget myhash field1 field2 #获取多个字段值
1) "hello1"
2) "world"
127.0.0.1:6379> hgetall myhash #获取全部的数据
1) "field1"
2) "hello1"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 #删除hash指定的key字段 对应的vaule值也就没有了
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> HLEN myhash #获取hash表的字段数量
(integer) 1
127.0.0.1:6379> HEXISTS myhash field1 #判断hash中指定字段是否存在
(integer) 0
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
127.0.0.1:6379> hkeys myhash #只获得所有field
1) "field2"
127.0.0.1:6379> HVALS myhash #只获得所有的vaule
1) "world"
incr decr
127.0.0.1:6379> hset myhash field3 5 #指定一个增量
(integer) 1
127.0.0.1:6379> HINCRBY myhash field3 1
(integer) 6
127.0.0.1:6379> HSETNX myhash field4 hello #如果不存在则可以设置,如果存在则不能设置
(integer) 1
127.0.0.1:6379> HSETNX myhash field4 world
(integer) 0
可以存一些变更数据 user name age ,尤其是用户信息之类的,经常变动的信息 hash更适合对象的存储 string更适合字符串的存储
####################################
Zset有序集合详解
在set基础上,增加了一个值,set k1 v1 zset k1 score v1
127.0.0.1:6379> zadd myset 1 one #添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three #添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
排序如何实现
127.0.0.1:6379> zadd salary 2500 xiaohong #添加3个用户
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 200 kuangshen
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # --inf 是负无穷
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores #显示全部用户并附带成绩
1) "kuangshen"
2) "200"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores #显示工资小于2500员工的升序排序
1) "kuangshen"
2) "200"
3) "xiaohong"
4) "2500"
移除rem中的元素
127.0.0.1:6379> zrange salary 0 -1
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong #移除有序集合中有序的元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "kuangshen"
2) "zhangsan"
获取有序集合中的个数
127.0.0.1:6379> ZCARD salary
(integer) 2
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 test
(integer) 2
127.0.0.1:6379> ZCOUNT myset 1 3 #获取指定区间成员的数量
(integer) 3
127.0.0.1:6379>

浙公网安备 33010602011771号