Redis的学习笔记(2)

一、字符串类型及其操作

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以
容纳的数据长度是512M。

SET key value:将key设置成指定字符串,如果存在就覆盖原有值。

127.0.0.1:6379> set mykey "hello"
OK

EXISTS:测试键值是否存在,存在返回1,不存在返回0.

127.0.0.1:6379> EXISTS mykey
(integer) 1

get key:获取键值

127.0.0.1:6379> get mykey
"hello"

APPEND:追加键值

127.0.0.1:6379> APPEND mykey "world!"
(integer) 11
127.0.0.1:6379> get mykey
"helloworld!"
127.0.0.1:6379>

STRLEN:获取指定键的长度

127.0.0.1:6379> STRLEN mykey
(integer) 11

INCR:原子加一(只能对不存在的键值对)

127.0.0.1:6379> INCR mykey1
(integer) 1
127.0.0.1:6379> INCR mykey1
(integer) 2
127.0.0.1:6379> INCR mykey1
(integer) 3
127.0.0.1:6379> INCR mykey1
(integer) 4

DECR:原子减一

127.0.0.1:6379> DECR mykey1
(integer) 3
127.0.0.1:6379> DECR mykey1
(integer) 2
127.0.0.1:6379> DECR mykey1
(integer) 1
127.0.0.1:6379>

INCRBY:原子加指定数

127.0.0.1:6379> INCRBY mykey1 3
(integer) 4

DECRBY:原子减指定数

127.0.0.1:6379> DECRBY mykey1 2
(integer) 2

GETSET:获取新的的键值,返回原来的键值

127.0.0.1:6379> GETSET mykey1 '123'
"2"
127.0.0.1:6379> GETSET mykey1 'abc'
"123"
127.0.0.1:6379> GETSET mykey1 '666'
"abc"
127.0.0.1:6379>

GETRANGE:获取指定长度的键值内容

127.0.0.1:6379> set mykey1 'this is yang'
OK
127.0.0.1:6379> GETRANGE mykey1 0 -1
"this is yang"
127.0.0.1:6379> GETRANGE mykey1 -3 -1
"ang"
127.0.0.1:6379> GETRANGE mykey1 0 2
"thi"
127.0.0.1:6379>

MSET\MGET:设置相应键值,获取相应键值

127.0.0.1:6379> MSET k1 1 k2 2
OK
127.0.0.1:6379> MGET k1 k2 k3
1) "1"
2) "2"
3) (nil)
127.0.0.1:6379>

SETNX:设置一个不存在的键的值,若存在就不成功。

127.0.0.1:6379> SETNX k1 11
(integer) 0
127.0.0.1:6379> SETNX k2 22
(integer) 0
127.0.0.1:6379> SETNX k3 33
(integer) 1
127.0.0.1:6379> GET k3
"33"

SETEX:设置键值过期时间

127.0.0.1:6379> SETEX k3 5 123
OK
127.0.0.1:6379> TTL k3
(integer) -2
127.0.0.1:6379> TTL k3
(integer) -2
127.0.0.1:6379> GET k3
(nil)

二、hash类型及其操作

我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
HSET/HGET/HDEL:hash数据的建立、获取、删除。

127.0.0.1:6379> HSET tom name tom age 20
(integer) 2
127.0.0.1:6379> HGET tom name
"tom"
127.0.0.1:6379> HGET tom age
"20"
127.0.0.1:6379> HDEL tom name
(integer) 1
127.0.0.1:6379> HGET tom age
"20"
127.0.0.1:6379> HSET tom gender 'M'
(integer) 1
127.0.0.1:6379> HGET tom gender
"M"

HLEN/获取字段
HEXISTS/测试字段,存在为1,不存在为0
HSETNX/创建不存键值,存在为0

127.0.0.1:6379> HLEN tom
(integer) 2
127.0.0.1:6379> HEXISTS tom age
(integer) 1
127.0.0.1:6379> HEXISTS tom  name
(integer) 0
127.0.0.1:6379> HSETNX tom add 'shanghai'
(integer) 1
127.0.0.1:6379> HSETNX tom add 'xian'
(integer) 0

HVAL/获取字段内所以键值
HMGET/获取字段指定键值

127.0.0.1:6379> HVALS tom
1) "20"
2) "M"
3) "shanghai"
127.0.0.1:6379> HMGET tom add gender
1) "shanghai"
2) "M"

HGETALL:获取所有键值和字段
HINCRBY:指定字段的键值加指定参数

127.0.0.1:6379> HGETALL tom
1) "age"
2) "20"
3) "gender"
4) "M"
5) "add"
6) "shanghai"
127.0.0.1:6379> HINCRBY tom age 1
(integer) 21

HKEYS:所有的键
HVALS:所有的值

127.0.0.1:6379> HKEYS tom
1) "age"
2) "gender"
3) "add"
127.0.0.1:6379> HVALS tom
1) "21"
2) "M"
3) "shanghai"

HSTRLEN:获取指定字段的长度

127.0.0.1:6379> HSTRLEN tom add
(integer) 8

三、list类型及操作

在Redis中,List类型是的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的 元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。 List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量 时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
LPUSH:从左创建
LRANGE:获取
LPUSHX:存在就能压进去,不存就返回0

127.0.0.1:6379> DEL mykey
(integer) 1
127.0.0.1:6379> LPUSH mykey a b c d
(integer) 4
127.0.0.1:6379> LRANGE mykey 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> LPUSHX mykey3 e
(integer) 0
127.0.0.1:6379> LPUSHX mykey e
(integer) 5
127.0.0.1:6379> LRANGE mykey 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"

LPOP:从上往出弹;
LLEN:显示长度

127.0.0.1:6379> LPOP mykey
"e"
127.0.0.1:6379> LPOP mykey
"d"
127.0.0.1:6379> LRANGE mykey 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LLEN mykey
(integer) 3

LREM:删除指定顺序的指定数量的键值

127.0.0.1:6379> RPUSH mykey a b c d e b d e c a a b d
(integer) 13
127.0.0.1:6379> LRANGE mykey 0 -1
 1) "a"
 2) "b"
 3) "c"
 4) "d"
 5) "e"
 6) "b"
 7) "d"
 8) "e"
 9) "c"
10) "a"
11) "a"
12) "b"
13) "d"
127.0.0.1:6379> LREM mykey 3 a
(integer) 3
127.0.0.1:6379> LRANGE mykey 0 -1
 1) "b"
 2) "c"
 3) "d"
 4) "e"
 5) "b"
 6) "d"
 7) "e"
 8) "c"
 9) "b"
10) "d"

LSET:根据索引设置键值

127.0.0.1:6379> RPUSH mykey a b c d
(integer) 4
127.0.0.1:6379> LRANGE mykey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> LSET mykey 0 1
OK
127.0.0.1:6379> LRANGE mykey 0 -1
1) "1"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> LSET mykey -2 6
OK
127.0.0.1:6379> LRANGE mykey 0 -1
1) "1"
2) "b"
3) "6"
4) "d"

LINDEX:通过索引获值

127.0.0.1:6379> LRANGE mykey 0 -1
1) "1"
2) "b"
3) "6"
4) "d"
127.0.0.1:6379> LINDEX mykey 1
"b"
127.0.0.1:6379> LINDEX mykey -1
"d"

LTRIM:只需要保留该位置的值,剩下的修剪掉

127.0.0.1:6379> LRANGE mykey 0 -1
1) "1"
2) "b"
3) "6"
4) "d"
127.0.0.1:6379> LTRIM mykey 0 1
OK
127.0.0.1:6379> LRANGE mykey 0 -1
1) "1"
2) "b"

LINSERT:在指定元素之前或之后插入值

127.0.0.1:6379> LRANGE mykey 0 -1
1) "1"
2) "b"
127.0.0.1:6379> LINSERT mykey before 1 2
(integer) 3
127.0.0.1:6379> LRANGE mykey 0 -1
1) "2"
2) "1"
3) "b"
127.0.0.1:6379> LINSERT mykey after b a
(integer) 4
127.0.0.1:6379> LRANGE mykey 0 -1
1) "2"
2) "1"
3) "b"
4) "a"
127.0.0.1:6379>

RPOPLPUSH:把源表中最后一个值弹出来放在新的列表中

127.0.0.1:6379> RPUSH key1 one tow three four
(integer) 4
127.0.0.1:6379> RPOPLPUSH key1 key2
"four"
127.0.0.1:6379> LRANGE key1 0 -1
1) "one"
2) "tow"
3) "three"
127.0.0.1:6379> LRANGE key2 0 -1
1) "four"
127.0.0.1:6379>

set类型及操作

SADD:创建集合,并存放数据值
SMEMBERS:获取集合内的值,若有重复的只显示一次

127.0.0.1:6379> SADD myset hello world
(integer) 2
127.0.0.1:6379> SMEMBERS myset
1) "world"
2) "hello"
127.0.0.1:6379> SADD myset2 a b a c d
(integer) 4
127.0.0.1:6379> SMEMBERS myset2
1) "c"
2) "a"
3) "d"
4) "b"

SCARD:获取集合的值的数量
SISMEMBER:获取集合内指定元素个数
SPOP:随机弹出集合内的一个元素,也可以指定弹出几个
SREM:指定移除哪个元素

127.0.0.1:6379> SCARD myset2
(integer) 4
127.0.0.1:6379> SISMEMBER myset2 a
(integer) 1
127.0.0.1:6379> SMEMBERS myset2
1) "c"
2) "a"
3) "d"
4) "b"
127.0.0.1:6379> SPOP myset2
"d"
127.0.0.1:6379> SPOP myset2 3
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> SPOP myset2 2
(empty array)
127.0.0.1:6379> SMEMBERS myset2
(empty array)
127.0.0.1:6379> SADD myset2 a b c d e
(integer) 5
127.0.0.1:6379> SMEMBERS myset2
1) "c"
2) "a"
3) "d"
4) "b"
5) "e"
127.0.0.1:6379> SREM myset2 c
(integer) 1
127.0.0.1:6379> SMEMBERS myset2
1) "d"
2) "b"
3) "a"
4) "e"

SRANDMEMBER:随机获取集合中的元素,对原来的集合不影响。
SMOVE:将源文件中的元素移到目标文件中去

127.0.0.1:6379> SRANDMEMBER myset2
"b"
127.0.0.1:6379> SRANDMEMBER myset2 2
1) "e"
2) "b"
127.0.0.1:6379> SMOVE myset2 myset3 a
(integer) 1
127.0.0.1:6379> SMEMBERS myset3
1) "a"

SDIFF:求两集合之间的差集
SDIFFSTORE:将差集存放到指定集合
SINTER:求两集合的交集
SINTERSTORE:将集合的交集存放到指定集合
SUNION:求集合的并集
SUNIONSTORE:将集合的并集存放到指定集合中

127.0.0.1:6379> SADD myset1 a b c d e f
(integer) 6
127.0.0.1:6379> SADD myset2 a c e
(integer) 3
127.0.0.1:6379> SDIFF myset1 myset2
1) "f"
2) "b"
3) "d"
127.0.0.1:6379> SDIFF myset2 myset1
(empty array)
127.0.0.1:6379> SDIFFSTORE myset3 myset1 myset2
(integer) 3

127.0.0.1:6379> SINTER myset1 myset2
1) "c"
2) "a"
3) "e"
127.0.0.1:6379> SUNION myset1 myset2
1) "d"
2) "a"
3) "c"
4) "e"
5) "f"
6) "b"
127.0.0.1:6379> SINTERSTORE myset4 myset1 myset2
(integer) 3
127.0.0.1:6379> SUNIONSTORE myset5 myset1 myset2
(integer) 6

应用范围:

1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场 景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所 有购买某一电子设备的客户ID被存储在一个指定的 Set中,而购买另外一种电子产品的客户ID被存储在另外 一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的 intersections命令就可以 充分发挥它的方便和效率的优势了。

应用案例1:

1、创建四个用户并添加邮箱:

127.0.0.1:6379> set it_user:id:1:username tom
OK
127.0.0.1:6379> set id_user:id:1:emile tom@123.com
OK
127.0.0.1:6379> set it_user:id:2:username john
OK
127.0.0.1:6379> set id_user:id:2:emile john@qq.com
OK
127.0.0.1:6379> set it_user:id:3:username bob
OK
127.0.0.1:6379> set id_user:id:3:emile bob@163.com
OK
127.0.0.1:6379> set it_user:id:4:username smith
OK
127.0.0.1:6379> set id_user:id:4:emile smith@163.com
OK
127.0.0.1:6379> keys it_user*
1) "it_user:id:3:username"
2) "it_user:id:2:username"
3) "it_user:id:1:username"
4) "it_user:id:4:username"

2、设定朋友关系,并查看共同好友关系:

127.0.0.1:6379> SADD set:user:id:1:friend 2 3
(integer) 2
127.0.0.1:6379> SMEMBERS set:user:id:1:friend
1) "2"
2) "3"
127.0.0.1:6379> SADD set:user:id:4:friend 3
(integer) 1
127.0.0.1:6379> SMEMBERS set:user:id:4:friend
1) "3"
共同的朋友
127.0.0.1:6379> SINTER set:user:id:1:friend set:user:id:4:friend
1) "3"
全部的朋友
127.0.0.1:6379> SUNION set:user:id:1:friend set:user:id:4:friend
1) "2"
2) "3"
介绍朋友
127.0.0.1:6379> SDIFF set:user:id:1:friend set:user:id:4:friend
1) "2"

FLUSHDB清空所有数据

127.0.0.1:6379> FLUSHdb
OK

zset类型和操作

Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted- Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管 Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。
在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集 合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现 的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。

ZADD:添加到有序set的一个或多个成员,如果已经存在,则是更新操作。
ZCARD:获取长度
ZRANGE:返回索引区间的值
ZRANK:返回索引位置
ZSCORE:返回索引值的分数
ZCOUNT:满足索引分数区间的数量
ZINCRBY:给索引的元素加分
ZREM:删除索引的元素

127.0.0.1:6379> ZADD k1 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZCARD k1
(integer) 3
127.0.0.1:6379> ZRANGE k1 1 2
1) "two"
2) "three"
把分数也显示出来
127.0.0.1:6379> ZRANGE k1 1 2 withscores
1) "two"
2) "2"
3) "three"
4) "3"
127.0.0.1:6379> ZRANK k1 "one"
(integer) 0
127.0.0.1:6379> ZRANK k1 "two"
(integer) 1
127.0.0.1:6379> ZSCORE k1 "one"
"1"
127.0.0.1:6379> ZCOUNT k1 2 4
(integer) 2
给one加3分
127.0.0.1:6379> ZINCRBY k1 3 one
"4"
删除元素
127.0.0.1:6379> ZREM k1 one
(integer) 1

ZRANGEBYSCORE:查找分数在2-4之间的元素

127.0.0.1:6379> ZRANGEBYSCORE k1 2 4
1) "two"
2) "three"
应用范围:

1). 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的 分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然我们也可以利用ZRANK命令通过 username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的 获取和某个玩家积分相 近的其他用户的信息。
2). Sorted-Sets类型还可用于构建索引数据。

key命令的使用

1、flushdb清空当前数据库

127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>

2、先给每个类型的建立一些键

127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set k2 2
OK
127.0.0.1:6379> sadd s1 a b c d e
(integer) 5
127.0.0.1:6379> HSET h1 age 20
(integer) 1
127.0.0.1:6379> HSET h1 addr xian
(integer) 1
127.0.0.1:6379> LPUSH l1 a b c d e
(integer) 5
127.0.0.1:6379> ZADD z1 1 a 2 b 3 c 4 d
(integer) 4

3、查看、删除、验证存在、移动

127.0.0.1:6379> keys *
1) "z1"
2) "k1"
3) "k2"
4) "h1"
5) "s1"
6) "l1"
127.0.0.1:6379> keys k*
1) "k1"
2) "k2"
127.0.0.1:6379> EXISTS l1
(integer) 1
将z1移动到1数据库中
127.0.0.1:6379> MOVE z1 1
(integer) 1
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "h1"
4) "s1"
5) "l1"

4、查看移动后的

进入到1数据库里面才能查看
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> keys *
1) "z1"
再将他移回来了
127.0.0.1:6379[1]>MOVE z1 0
[root@node3 ~]# redis-cli
127.0.0.1:6379> keys *
1) "z1"
2) "k1"
3) "k2"
4) "h1"
5) "s1"
6) "l1"

5、修改键名

127.0.0.1:6379> RENAME z1 zkey1
OK
127.0.0.1:6379> keys *
1) "k1"
2) "zkey1"
3) "k2"
4) "h1"
5) "s1"
6) "l1"

6、设置键过期时间

127.0.0.1:6379> GET k1
"1"
127.0.0.1:6379> TTL k1
(integer) -1
127.0.0.1:6379> EXPIRE k1 9
(integer) 1
127.0.0.1:6379> TTL k1
(integer) 3
在这里一定要敲快一点,否则过了时间,键就不存在了
127.0.0.1:6379> PERSIST k1

7、获取键值类型

127.0.0.1:6379> TYPE h1
hash
127.0.0.1:6379> TYPE l1
list
127.0.0.1:6379> TYPE k2
string

8、给元素排序

127.0.0.1:6379> LPUSH l2 3 5 6 2 7 9 1
(integer) 7
127.0.0.1:6379> SORT l2
1) "1"
2) "2"
3) "3"
4) "5"
5) "6"
6) "7"
7) "9"
默认是升序,加desc为降序
127.0.0.1:6379> SORT l2 desc
1) "9"
2) "7"
3) "6"
4) "5"
5) "3"
6) "2"
7) "1"
127.0.0.1:6
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值