Redis教程--redis的学习
基础
简介
以下简摘抄至redis官网教程
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
下载
Linux下安装
地址:https://www.redis.net.cn/download
Windows下安装
地址:https://github.com/MicrosoftArchive/redis/releases
安装
打开cdm窗口,切换到redis文件夹路径,输入:
redis-server.exe redis.windows.conf
出现以下界面代表启动成功,默认端口号是6379
,所以要保证6379
端口没有被占用。
另外打开一个cmd窗口,之前那个窗口不能关闭,否则不能运行
切换到redis路径。输入
.\redis-cli.exe -h 127.0.0.1 -p 6379
命令
keys命令
DEL key
该命令用于在 key 存在时删除 key。EXISTS key
检查给定 key 是否存在。
先保存一个key,检测是否存在,删除之后检测是否存在
127.0.0.1:6379> set user "id=1"
OK
127.0.0.1:6379> exists user
(integer) 1
127.0.0.1:6379> del user
(integer) 1
127.0.0.1:6379> exists user
(integer) 0
DUMP key
序列化给定 key ,并返回被序列化的值。EXPIRE key seconds
为给定 key 设置过期时间,以秒计。
127.0.0.1:6379> set name "tom"
OK
127.0.0.1:6379> expire name 3 //设置3S之后过期
(integer) 1
127.0.0.1:6379> exists name //3s之后
(integer) 0
EXPIREAT key timestamp EXPIREAT
的作用和 EXPIRE 类似,都用于为 key 设置过期时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。PEXPIRE key milliseconds
设置 key 的过期时间以毫秒计。PEXPIREAT key milliseconds-timestamp
设置 key 过期时间的时间戳(unix timestamp) 以毫秒计KEYS pattern
查找所有符合给定模式( pattern)的 key 。MOVE key db
将当前数据库的 key 移动到给定的数据库 db 当中。PERSIST key
移除 key 的过期时间,key 将持久保持。PTTL key
以毫秒为单位返回 key 的剩余的过期时间。TTL key
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。RANDOMKEY
从当前数据库中随机返回一个 key 。RENAME key newkey
修改 key 的名称RENAMENX key newkey
仅当 newkey 不存在时,将 key 改名为 newkey 。TYPE key
返回 key 所储存的值的类型。
127.0.0.1:6379> set name "tom"
OK
127.0.0.1:6379> type name
string
字符串
SET key value
此命令用于设置指定键的值。GET key
此命令用于检索键的值。
127.0.0.1:6379> set name "Vijar Wang"
OK
127.0.0.1:6379> get name
"Vijar Wang"
GETRANGE key start end
此命令用于获取存储在键中的字符串的子字符串。
127.0.0.1:6379> getrange name 1 2
"ij"
127.0.0.1:6379>
GETSET key value
此命令用于设置键的字符串值并返回其旧值。
127.0.0.1:6379> GETSET name Vijar
"Vijar"
127.0.0.1:6379> get name
"Vijar"
MGET key1 [key2 ..]
此命令用于获取所有给定键的值
127.0.0.1:6379> MGET name student
1) "Vijar"
2) "TOM"
SETEX key secodes value
此命令用于设置key到期时的值(以秒为单位)
SETEX 和这两个命令的不同之处在于 SETEX 是一个原子(atomic)操作, 它可以在同一时间内完成设置值和设置过期时间这两个操作, 因此 SETEX 命令在储存缓存的时候非常实用。
127.0.0.1:6379> setex name 5 OUYANG
OK
127.0.0.1:6379> get name
"OUYANG"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
SETNX key value
仅当key不存在时,此命令用于设置key的值返回1.如果已经存在则返回0,且该key不做任何改变,
127.0.0.1:6379> setnx name "Vijar Wang"
(integer) 1
127.0.0.1:6379> get name
"Vijar Wang"
127.0.0.1:6379> setnx name "Wang"
(integer) 0
127.0.0.1:6379> get name
"Vijar Wang"
STRLEN key
此命令用于检索存储在key中的值的长度
127.0.0.1:6379> get name
"Vijar Wang"
127.0.0.1:6379> strlen name
(integer) 10
MSET key value [key value …]
此命令用于将多个键设置为多个值
127.0.0.1:6379> mset student1 tom student2 peter
OK
127.0.0.1:6379> mget student1 student2
1) "tom"
2) "peter"
MSETNX key value [key value …]
仅当没有任何键存在时,此命令用于将多个键设置为多个值
仅设置不存在的key,如果存在则不会做任何改变。PSETEX key milliseconds value
此命令用于设置key的值和到期时间(以毫秒为单位)INCR key
此命令用于将键的整数值递增1
127.0.0.1:6379> set key 1
OK
127.0.0.1:6379> get key
"1"
127.0.0.1:6379> incr key
(integer) 2
127.0.0.1:6379> get key
"2"
如果key中的值为字符串,则会报异常信息。
127.0.0.1:6379> set key name1
OK
127.0.0.1:6379> get key
"name1"
127.0.0.1:6379> incr key
(error) ERR value is not an integer or out of range
INCRBY key increment
此命令用于按给定量递增键的整数值
127.0.0.1:6379> set key 1
OK
127.0.0.1:6379> get key
"1"
127.0.0.1:6379> incrby key 2
(integer) 3
127.0.0.1:6379> get key
"3"
INCRBYFLOAT key increment
此命令用于按给定的量增加键的浮点值DECR key
此命令用于将键的整数值递减1DECRBY key decrement
此命令用于按给定数量递减键的整数APPEND key value
此命令用于将值附加到键 (在值后面拼接)
哈希(Hashes)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。每个哈希键中可以存储多达40亿个字段值对。
127.0.0.1:6379> HMSET employee:1 name jobNumber phone sex birthday 200
OK
127.0.0.1:6379> HMSET employee:1 name jobNumber phone sex birthday
(error) ERR wrong number of arguments for HMSET
127.0.0.1:6379> HMSET employee:1 name jobNumber phone sex birthday
(error) ERR wrong number of arguments for HMSET
127.0.0.1:6379> HMSET employee:1 name jobNumber phone sex birthday 1
OK
注意:存储时以键值对形式保存,如果有一个只设置了键但没设置值则会报出异常。
HDEL key field2[field2]
删除一个或多个哈希字段
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "ajeet"
3) "password"
4) "javatpoint"
5) "alexa"
6) "2000"
127.0.0.1:6379> HDEL user:1 alexa
(integer) 1
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "ajeet"
3) "password"
4) "javatpoint"
HEXISTS key field
确定是否存在哈希字段。
127.0.0.1:6379> hexists user:1 username
(integer) 1
127.0.0.1:6379> hexists user:1 name
(integer) 0
HGET key field
获取存储在指定键中的哈希字段的值。
127.0.0.1:6379> HGET user:1 username
"ajeet"
HINCRBY key field increment
按给定数字递增散列字段的整数值
127.0.0.1:6379> HGET user1: age
"21"
127.0.0.1:6379> HINCRBY user1: age 3
(integer) 24
HINCRBYFLOAT key field increment
将散列字段的浮点值递增给定量HKEYS key
获取哈希中的所有字段
127.0.0.1:6379> hkeys user:1
1) "username"
2) "password"
HLEN key
获取散列中的字段数
127.0.0.1:6379> hlen user:1
(integer) 2
HMGET key1 [field2]
获取所有给定哈希字段的值
127.0.0.1:6379> hmget user:1 password
1) "javatpoint"
HMSET key field1 value1 [field2 value2]
将多个哈希字段设置为多个值
127.0.0.1:6379> hmset user name "TOM" age 19 no 1
OK
HSET key field
设置哈希字段的字符串值
127.0.0.1:6379> hset user phone 123456
(integer) 1
127.0.0.1:6379> hget user phone
"123456"
HSETNX key field
仅当字段不存在时,设置哈希字段的值,存在则返回0
127.0.0.1:6379> hget user phone
"123456"
127.0.0.1:6379> HSETNX user phone 157175
(integer) 0
127.0.0.1:6379> hget user phone
"123456"
127.0.0.1:6379> HSETNX user birthday "2001-10-1"
(integer) 1
127.0.0.1:6379> hget user birthday
"2001-10-1"
HVALS key
获取哈希值中的所有值
127.0.0.1:6379> hvals user
1) "TOM"
2) "19"
3) "1"
4) "123456"
5) "2001-10-1"
列表
Redis列表是按插入顺序排序的字符串列表。可以在列表的头部(左边)或尾部(右边)添加元素。
LPUSH key value1 [value2]
将一个或多个值添加到列表中。
向列表中添加5个值
127.0.0.1:6379> lpush javatpoint sql java ajax jquery
(integer) 5
BLPOP key1 [key2] timeout
删除和获取列表中的第一个元素,或阻塞直到一个元素可用。
127.0.0.1:6379> lrange javatpoint 1 5
1) "java"
2) "sql"
3) "sql"
127.0.0.1:6379> blpop javatpoint 12
1) "javatpoint"
2) "mysql"
127.0.0.1:6379> lrange javatpoint 1 5
1) "sql"
2) "sql"
BRPOP key1 [key2] timeout
删除和获取列表中的最后一个元素,或阻塞直到一个元素可用。
127.0.0.1:6379> lrange javatpoint 1 6
1) "mysql"
2) "java"
3) "sql"
4) "sql"
127.0.0.1:6379> brpop javatpoint 200
1) "javatpoint"
2) "sql"
127.0.0.1:6379> lrange javatpoint 1 6
1) "mysql"
2) "java"
3) "sql"
LINDEX key index
通过索引从列表中获取元素。(索引从1开始)
127.0.0.1:6379> lindex javatpoint 1
"mysql"
LINSERT key before|after pivot value
在列表中的另一个元素之前或之后插入元素。
集合
SADD
向集合添加一个或多个成员
返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素。
127.0.0.1:6379> SADD myset "Hello" "World"
(integer) 2
127.0.0.1:6379> SMEMBERS myset
1) "Hello"
2) "World"
SCARD
获取集合的成员数
集合中成员的数量。 当集合 key 不存在时,返回 0
127.0.0.1:6379> SCARD myset
(integer) 2
SDIFF
返回给定所有集合的差集
返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集。
127.0.0.1:6379> SMEMBERS myset
1) "Hello"
2) "World"
127.0.0.1:6379> SMEMBERS yourset
1) "Hello"
2) "Master"
127.0.0.1:6379> SDIFF myset yourset
1) "World"
SDIFFSTORE
返回给定所有集合的差集并存储在 destination 中
与SDIFF相似,但是会把找到的值储存到一个新的键中
127.0.0.1:6379> SDIFFSTORE diff myset yourset
(integer) 1
127.0.0.1:6379> SMEMBERS diff
1) "World"
SINTER
返回给定所有集合的交集
返回由所有给定集合的交集生成的集合的成员。
127.0.0.1:6379> SINTER myset yourset
1) "Hello"
SINTERSTORE
返回给定所有集合的交集并存储在 destination 中
127.0.0.1:6379> SINTERSTORE sinters myset yourset
(integer) 1
127.0.0.1:6379> SMEMBERS sinters
1) "Hello"
SISMEMBER
判断 member 元素是否是集合 key 的成员
1 如果成员元素是集合的成员,返回 1 。
0 如果成员元素不是集合的成员,或 key 不存在,返回 0
127.0.0.1:6379> SISMEMBER myset Hello
(integer) 1
127.0.0.1:6379> SISMEMBER myset TOM
(integer) 0
SMEMBERS
返回集合中的所有成员
Redis SISMEMBER 命令返回存储在 key 中的集合的所有的成员。 不存在的集合被视为空集合。SMOVE
将 member 元素从 source 集合移动到 destination 集合
127.0.0.1:6379> SMEMBERS myset
1) "Hello"
2) "World"
127.0.0.1:6379> SMOVE myset otherset "Hello"
(integer) 1
127.0.0.1:6379> SMEMBERS otherset
1) "Hello"
SPOP
移除并返回集合中的一个随机元素
127.0.0.1:6379> SMEMBERS myset
1) "two"
2) "World"
3) "one"
127.0.0.1:6379> spop myset
"one"
127.0.0.1:6379> SMEMBERS myset
1) "two"
2) "World"
SRANDMEMBER
返回集合中一个或多个随机数
当仅使用key参数调用时,从存储在key的设置值中返回一个随机元素。
从2.6版本开始,当使用额外的count参数调用时,如果count为正数,返回一个计数不同元素的数组。如果在计数为负数的情况下调用,则行为会发生变化,并且允许命令多次返回相同的元素。在这种情况下,返回的元素数是指定计数的绝对值。
当仅使用关键参数调用时,该操作类似于SPOP,不过,SPOP也会删除随机选择的元素
127.0.0.1:6379> SMEMBERS myset
1) "two"
2) "World"
127.0.0.1:6379> SRANDMEMBER myset
"World"
127.0.0.1:6379> SMEMBERS myset
1) "two"
2) "World"
SREM
移除集合中一个或多个成员
127.0.0.1:6379> SMEMBERS myset
1) "three"
2) "two"
3) "World"
4) "one"
5) "four"
127.0.0.1:6379> srem myset four
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "two"
2) "World"
3) "one"
4) "three"
SUNION
返回所有给定集合的并集
不存在的键被认为是空集
127.0.0.1:6379> SMEMBERS myset
1) "two"
2) "World"
3) "one"
4) "three"
127.0.0.1:6379> SMEMBERS yourset
1) "Hello"
2) "Master"
127.0.0.1:6379> SUNION myset yourset
1) "World"
2) "two"
3) "one"
4) "three"
5) "Hello"
6) "Master"
SUNIONSTORE
所有给定集合的并集存储在 destination 集合中
与SUNION相同,但是会把结果储存到一个新的集合中SSCAN
迭代集合中的元素
SSCAN 命令基本语法如下:
SSCAN key cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
> SADD myset1 "Google"
(integer) 1
> SADD myset1 "Redis"
(integer) 1
> SADD myset1 "Taobao"
(integer) 1
> SSCAN myset1 0 match R*
1) "0"
2) 1) "Redis"
有序集合
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数 ( score ) 却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 – 1 ( 4294967295 ) , 每个集合可存储 40 多亿个成员。
ZADD
向有序集合添加一个或多个成员,或者更新已存在成员的分数
127.0.0.1:6379> ZADD comcn 1 redis
(integer) 1
127.0.0.1:6379> ZADD comcn 2 cassandra 3 cassandra
(integer) 1
127.0.0.1:6379> ZRANGE comcn 0 10 WITHSCORES
1) "redis"
2) "1"
3) "cassandra"
4) "3"
127.0.0.1:6379>
ZCARD
获取有序集合的成员数
如果 member 已经是有序集的成员,那么更新这个 member 的 score 值,并重新插入这个 member 元素,来保证该 member 在正确的位置上。
如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
score 值可以是整数值或双精度浮点数,score 可为正也可以为负。
ZADD key [NX|XX] [CH] [INCR] score member [score member …]
添加单个元素 redis> ZADD page_rank 10 google.com (integer) 1
127.0.0.1:6379> ZADD comcn 1 redis //添加一个元素
(integer) 1
127.0.0.1:6379> ZADD comcn 2 cassandra 3 cassandra
(integer) 1
127.0.0.1:6379> ZRANGE comcn 0 10 WITHSCORES
1) "redis"
2) "1"
3) "cassandra"
4) "3"
ZCOUNT
计算在有序集合中指定区间分数的成员数
127.0.0.1:6379> zadd myset 1 "one" 2 "two" 3 "three"
(integer) 3
127.0.0.1:6379> zcount myset -inf +inf
(integer) 3
127.0.0.1:6379> zcount myset (1 3
(integer) 2
ZINCRBY
有序集合中对指定成员的分数加上增量 incrementZINTERSTORE
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中ZLEXCOUNT
在有序集合中计算指定字典区间内成员数量ZRANGE
通过索引区间返回有序集合成指定区间内的成员
0为第一个成员
127.0.0.1:6379> zrange myset 0 10
1) "one"
2) "two"
3) "three"
ZRANGEBYLEX
通过字典区间返回有序集合的成员ZRANGEBYSCORE
通过分数返回有序集合指定区间内的成员ZRANK
返回有序集合中指定成员的索引ZREM
移除有序集合中的一个或多个成员ZREMRANGEBYLEX
移除有序集合中给定的字典区间的所有成员ZREMRANGEBYRANK
移除有序集合中给定的排名区间的所有成员ZREMRANGEBYSCORE
移除有序集合中给定的分数区间的所有成员ZREVRANGE
返回有序集中指定区间内的成员,通过索引,分数从高到底ZREVRANGEBYSCORE
返回有序集中指定分数区间内的成员,分数从高到低排序ZREVRANK
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序ZSCORE
返回有序集中,成员的分数值ZUNIONSTORE
计算一个或多个有序集的并集,并存储在新的 key 中ZSCAN
迭代有序集合中的元素(包括元素成员和元素分值)