![2af7c4b8b49b7fc5822fb549694a10ae.png](https://i-blog.csdnimg.cn/blog_migrate/55170d553b6a049f3b2373146d451bf9.jpeg)
Redis基本指令
#查询当前库的所有键keys *#判断某个键是否存在exists key#查看键的类型type key#删除某个键del key#为键值设置过期时间单位秒expire key seconds#查看还有多少秒过期,-1表示永不过期 -2表示已过期ttl key#查看当前数据库key的数量dbsize#清空当前库Flushdb#通杀全部库Flushall#结果127.0.0.1:6379> keys *1) "a"127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> exists a(integer) 1127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> type astring127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> del a(integer) 1
Redis基本数据类型
String
- String是Redis最基本的类型,一个key对应一个value
- String类型是二进制安全的,意味着可以包含任何数据,比如jpg图片或者序列化的对象
- 一个Redis中字符串value最多可以是512M
#添加键值对127.0.0.1:6379> set k1 v1OK#查询对应键值127.0.0.1:6379> get k1"v1"#讲给定的value添加到原值的末尾127.0.0.1:6379> append k1 234(integer) 5#获取值的长度127.0.0.1:6379> strlen k1(integer) 5#只有在key不存的时候 才会设置key的值127.0.0.1:6379> setnx k1 asd(integer) 0127.0.0.1:6379> setnx k2 v2(integer) 1127.0.0.1:6379> set k3 12OK#将key对应的value值加1,只能对数字进行操作127.0.0.1:6379> incr k3(integer) 13#将key对应的value值减1,只能对数字进行操作127.0.0.1:6379> decr k3(integer) 12#将key对应的value值加步长,只能对数字进行操作127.0.0.1:6379> incrby k3 10(integer) 22#将key对应的value值减步长,只能对数字进行操作127.0.0.1:6379> decrby k3 5(integer) 17#设置一个或多个key-value127.0.0.1:6379> mset k4 v4 k5 v5OK#获取一个或多个value127.0.0.1:6379> mget k1 k2 k31) "v1234"2) "v2"3) "17"#当且仅当所有key都不存在时设置key-value127.0.0.1:6379> msetnx k1 v1 k6 v6(integer) 0#获取key对应值中范围值127.0.0.1:6379> getrange k1 0 2"v12"#设置key对应value的范围值127.0.0.1:6379> setrange k1 2 abc(integer) 5127.0.0.1:6379> get k1"v1abc"#设置键值的同时,设置过期时间,单位秒setex key 过期时间 value#设置新值同时获取旧值getset key value
原子性
所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束。中间不会有任何context switch(切换线程)
- 在单线程中,能够发生在单条指令中完成的操作都可以认为是‘原子操作’。因为中断只能发生于指令之间
- 在多线程中,不能被其他线程打断的操作就叫做原子操作
Redis单命令的原子性主要得益于Redis的单线程
List
- 单键多值
- Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)
- 它的底层实现是个双向链表,对两端的操作性能很高,通过索引下标操作中间的节点性能会较差
#从左边/右边插入一个或多个值127.0.0.1:6379> lpush testList a b c d e(integer) 5127.0.0.1:6379> rpush testList 1 2 3 4 5(integer) 10#从左边/右边吐出一个值,值在键在,值光键亡127.0.0.1:6379> lpop testList"e"127.0.0.1:6379> rpop testList"5"127.0.0.1:6379> rpush testListTwo x y z(integer) 3#从key1列表右边吐出一个值差到key2列表的左边127.0.0.1:6379> rpoplpush testList testListTwo"4"#按照索引下标获得元素(从左到右)127.0.0.1:6379> lrange testList 0 -11) "d"2) "c"3) "b"4) "a"5) "1"6) "2"7) "3"127.0.0.1:6379> lrange testListTwo 0 -11) "4"2) "x"3) "y"4) "z"#按照索引下标获得元素(从左到右)127.0.0.1:6379> lindex testList -1"3"#获得列表长度127.0.0.1:6379> llen testList(integer) 7#在value的前/后面插入新的value127.0.0.1:6379> linsert testList before 1 xyz(integer) 8127.0.0.1:6379> lrange testList 0 -11) "d"2) "c"3) "b"4) "a"5) "xyz"6) "1"7) "2"8) "3"127.0.0.1:6379> lpush testList 1 2 3(integer) 11127.0.0.1:6379> lrange testList 0 -1 1) "3" 2) "2" 3) "1" 4) "d" 5) "c" 6) "b" 7) "a" 8) "xyz" 9) "1"10) "2"11) "3"#从左边删除n个value(从左到右)127.0.0.1:6379> lrem testList 1 3(integer) 1127.0.0.1:6379> lrange testList 0 -1 1) "2" 2) "1" 3) "d" 4) "c" 5) "b" 6) "a" 7) "xyz" 8) "1" 9) "2"10) "3"#负数表示从又开始127.0.0.1:6379> lrem testList -1 2(integer) 1127.0.0.1:6379> lrange testList 0 -11) "2"2) "1"3) "d"4) "c"5) "b"6) "a"7) "xyz"8) "1"9) "3"#0表示删除所有127.0.0.1:6379> lrem testList 0 1(integer) 2127.0.0.1:6379> lrange testList 0 -11) "2"2) "d"3) "c"4) "b"5) "a"6) "xyz"7) "3"
Set
set对外提供的功能类似list是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是个选择,并且set提供了判断某个成员是否在一个set集合内的重要接口
Redis的set是string类型的无序集合,底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)
#将一个或多个member元素加入到集合key中,已经存在于集合的member元素将被忽略127.0.0.1:6379> sadd testSet a b c d e 1 2 3(integer) 8#取出该集合的所有值127.0.0.1:6379> SMEMBERS testSet1) "3"2) "b"3) "d"4) "1"5) "e"6) "2"7) "a"8) "c"#判断该集合是否有该value值127.0.0.1:6379> SISMEMBER testSet x(integer) 0#返回该集合的元素个数127.0.0.1:6379> scard testSet(integer) 8#删除集合中的某个元素127.0.0.1:6379> srem testSet a 1(integer) 2#随机从该集合中弹出一个值(删除)127.0.0.1:6379> spop testSet"3"#随机从集合中取出n个值(不删除)127.0.0.1:6379> SRANDMEMBER testSet 31) "e"2) "2"3) "c"127.0.0.1:6379> sadd testSet 1 2 3 4 5(integer) 4127.0.0.1:6379> sadd testSet2 a b c d e x y z(integer) 8#返回两个集合的交集元素127.0.0.1:6379> sinter testSet testSet21) "b"2) "d"3) "e"4) "c"#返回两个集合的并集元素127.0.0.1:6379> sunion testSet testSet2 1) "3" 2) "x" 3) "b" 4) "d" 5) "5" 6) "e" 7) "z" 8) "2" 9) "c"10) "y"11) "4"12) "1"13) "a"#返回两个集合的差集元素(顺序有关)127.0.0.1:6379> sdiff testSet testSet21) "1"2) "2"3) "3"4) "4"5) "5"
hash
- Redis hash是一个键值对集合
- 是一个string类型的field和value的映射表。hash特别适合存储对象
- 类似java里面的Map
#添加127.0.0.1:6379> hset userInfo user:1010:uid 1010(integer) 1#添加多个127.0.0.1:6379> hmset userInfo user:1010:username admin user:1010:password 123456OK#获取127.0.0.1:6379> hget userInfo user:1010:username"admin"#查询是否存在127.0.0.1:6379> hexists userInfo user:1010:uid(integer) 1#列出所有的field127.0.0.1:6379> hkeys userInfo1) "user:1010:uid"2) "user:1010:username"3) "user:1010:password"#列出所有值127.0.0.1:6379> hvals userInfo1) "1010"2) "admin"3) "123456"#列出所有键值对127.0.0.1:6379> hgetall userInfo1) "user:1010:1010"2) "1010"3) "user:1010:username"4) "admin"5) "user:1010:password"6) "123456"127.0.0.1:6379> hset userInfo user:1010:age 25(integer) 1#加步长127.0.0.1:6379> hincrby userInfo user:1010:age 10(integer) 35#没有则设置127.0.0.1:6379> hsetnx userInfo user:1010:sex 1(integer) 1#显示中文redis-cli --raw
zset
Redis有序集合zset(sorted set)与普通集合set非常相似,是一个没有重复元素的字符串集合,不同之处是有序集合的每个成员都关联了一个评分(score),这个评分被用来按照从最低分到最高分的方式排序集合中的成员,集合的成员是唯一的,但是评分可以是重复的
因为元素是有序的,所以你可以很快的根据评分或者次序(position)来获取一个范围的元素,访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表
#添加一个或多个 分数 元素127.0.0.1:6379> zadd testzSet 100 a 20 b 1 x 500 abc(integer) 4#获取元素127.0.0.1:6379> zrange testzSet 0 -11) "x"2) "b"3) "a"4) "abc"#如果元素存在 则覆盖score127.0.0.1:6379> zadd testzSet 1000 x(integer) 0127.0.0.1:6379> zrange testzSet 0 -11) "b"2) "a"3) "abc"4) "x"#不同元素相同score可以添加127.0.0.1:6379> zrange testzSet 0 -11) "b"2) "a"3) "abc"4) "x"5) "xyz"#取出分数范围元素127.0.0.1:6379> zrangebyscore testzSet 1 2001) "b"2) "a"#取出元素排序127.0.0.1:6379> zrevrangebyscore testzSet 1 500#为元素的score加上增量zincrby key incerment value#删除该集合下指定值的元素zrem key value#统计该集合,分数区间的元素个数zcount key min max#返回该值在集合中的排名zrank key value