Redis 基础命令和数据类型
一、Redis的官方简介
Introduction to Redis
Learn about the Redis open source project
Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
二、Redis基础命令
1.查看当前redis是否成功启动
ps -ef | grep redis
[root@localhost redis]# ps -ef | grep redis
root 3358 1 0 3月25 ? 00:04:19 ./bin/redis-server 127.0.0.1:6379
root 48716 75519 0 10:58 pts/1 00:00:00 grep --color=auto redis
[root@localhost redis]#
2.打开redis的client
[root@localhost redis]# ./bin/redis-cli
127.0.0.1:6379>
3.基础命令
127.0.0.1:6379> keys * //查看当前数据库中所有的key
1) "age"
2) "name"
127.0.0.1:6379> flushall //清空所有的key
OK
127.0.0.1:6379> keys *
(empty array) //当前key都被清空
127.0.0.1:6379> set name zhouquan
OK
127.0.0.1:6379> get name
"zhouquan"
127.0.0.1:6379> exists name //判断数据库是否存在key值
(integer) 1 //1表示是,0表示否
127.0.0.1:6379> exists age
(integer) 0
127.0.0.1:6379> move name 1 //移除key
(integer) 1
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name zhouquan
OK
127.0.0.1:6379> expire name 5 //设置过期时间
(integer) 1
127.0.0.1:6379> ttl name //查看key的剩余时间
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> keys * //过期后数据库中key已经清空
(empty array)
127.0.0.1:6379>
4.官网查看命令文档
地址:https://redis.io/commands/
三、五大基础类型
String、List、Set、Hash、zset
1.String
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> exists k
(integer) 0
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> append k1 "kobe" //字符串追加
(integer) 6
127.0.0.1:6379> get k1
"v1kobe"
127.0.0.1:6379> strlen k1 //字符串追加
(integer) 6
##################################################
127.0.0.1:6379> set view 0
OK
127.0.0.1:6379> get view
"0"
127.0.0.1:6379> incr view //自增1
(integer) 1
127.0.0.1:6379> decr view //自减一
(integer) 0
127.0.0.1:6379> get view
"0"
127.0.0.1:6379> incrby view 5 //设置步长,指定增量为5
(integer) 5
127.0.0.1:6379> incrby view 5
(integer) 10
127.0.0.1:6379> Decrby view 5
(integer) 5
127.0.0.1:6379>
##################################################
#获取字符串范围
127.0.0.1:6379> set name JeremyLin
OK
127.0.0.1:6379> getrange 0 5
"Jeremy"
127.0.0.1:6379> getrange name 0 -1
"JeremyLin"
127.0.0.1:6379>
##################################################
#替换
127.0.0.1:6379> setrange name 0 test
(integer) 9
127.0.0.1:6379> get name
"testmyLin"
127.0.0.1:6379>
##################################################
#setex(set with expire) //设置过期时间
#setnex( set if not exist) //不存在时则设置(在分布式锁中常常使用)
127.0.0.1:6379> setex testex 30 v1
OK
127.0.0.1:6379> get testex
"v1"
127.0.0.1:6379> ttl testex
(integer) 13
127.0.0.1:6379> ttl testex
(integer) 10
127.0.0.1:6379> ttl testex
(integer) 7
127.0.0.1:6379> ttl testex
(integer) -2
127.0.0.1:6379> get testex
(nil)
127.0.0.1:6379> setnx testex "hello"
(integer) 1
127.0.0.1:6379> keys *
1) "testex"
2) "name"
127.0.0.1:6379> get testex
"hello"
127.0.0.1:6379>
##################################################
#mset //批量设置值
#mget //批量获取值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 //同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3 //同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 //msetnx是一个原子性的操作
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379>
##################################################
#user:{id}:{field} //对象的方式存取值
127.0.0.1:6379> mset user:1:name zhouquan user:1:age 25
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhouquan"
2) "25"
127.0.0.1:6379>
##################################################
127.0.0.1:6379> getset db mysql //如果不存在值,则返回nil
(nil)
127.0.0.1:6379> get db
"mysql"
127.0.0.1:6379> getset db redis
"mysql"
127.0.0.1:6379> get db //如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379>
String类型的使用场景:
- 计数器
- 统计多单位的数量,例如浏览量相关
- 粉丝数量或者其他
2.List
在list中,可以设计成栈、队列、阻塞队列
#lpush
#rpush
127.0.0.1:6379> lpush list one two three //将一个或多个值,从左边插入到列表的头部
(integer) 3
127.0.0.1:6379> Lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list four //将一个或多个值,从右边插入到列表的尾部
(integer) 4
127.0.0.1:6379> Lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379>
##################################################
#lpop
#rpop
127.0.0.1:6379> lpop list #移除list的第一个元素
"three"
127.0.0.1:6379> rpop list #移除list的最后一个元素
"four"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379>
##################################################
#lindex 通过下表获取list中的值
#llen 获取列表的长度
127.0.0.1:6379> lrange list 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lindex list 0
"four"
127.0.0.1:6379> lindex list 3
"one"
127.0.0.1:6379> llen list
(integer) 4
##################################################
#lrem 移除list集合中指定个数的value 精确匹配
127.0.0.1:6379> lrange list 0 -1
1) "four"
2) "four"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> lrem list 1 one
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "four"
2) "four"
3) "three"
4) "two"
127.0.0.1:6379> lrem list 2 four
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379>
##################################################
trim:list截取
127.0.0.1:6379> lrange list 0 -1
1) "six"
2) "five"
3) "three"
4) "two"
127.0.0.1:6379> ltrim list 1 2
OK
127.0.0.1:6379> lrange list 0 -1
1) "five"
2) "three"
127.0.0.1:6379>
##################################################
#rpoplpush #移除列表中的最后一个元素到新的列表中
127.0.0.1:6379> lrange list 0 -1
1) "seven"
2) "six"
3) "seven"
4) "six"
5) "five"
127.0.0.1:6379> rpoplpush list newlist
"five"
127.0.0.1:6379> lrange list 0 -1
1) "seven"
2) "six"
3) "seven"
4) "six"
127.0.0.1:6379> lrange otherlist 0 -1
(empty array)
127.0.0.1:6379> lrange newlist 0 -1
1) "five"
##################################################
#lset 将列表中指定下表的值替换为另一个值
127.0.0.1:6379> lset list 0 other
OK
127.0.0.1:6379> lrange list 0 -1
1) "other"
2) "six"
3) "seven"
4) "six"
##################################################
#linsert //将某个具体的value插入到指定的某个元素的前面或者后面
127.0.0.1:6379> linsert list before seven insert1
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "other"
2) "six"
3) "insert1"
4) "seven"
5) "six"
127.0.0.1:6379>
小结:
- 本质上是一个链表,before node after ,left right都可以插入值
- 如果移除掉列表中的所有元素,也表示不存在
- 在两边插入或者改动值,效率最高!中间元素效率相对较低
3.Set
基础命令说明:
- sadd key member1[menber2] 向集合中无序添加一个或多个成员
- scard key 获取集合的大小
- smembers key 返回指定key中的所有成员
- sismenbers key member 查询member元素是否为集合中的成员,1:是,0:否
- srandmember key [count] 随机返回集合中的元素,默认为1
- spop key [count] 随机移除并返回count个成员,默认为1
- smove source destination member 将source集合中的成员移动到destination集合
- srem key member1[member2…] 移除集合中的一个或多个元素
- sdiff key1 [key2…] 返回所有集合的差集
- sdiffstore destination key1[key2…] 将差集的结果保存到新的集合中
- sunionstore destination key1[key2…] 将并集的结果保存到新的集合中
- sinter key1 [key2…] 返回所有集合的交集
- sunion key1 [key2…]返回所有集合的并集
- sscan key [match pattern] [count count] 在数据量较大的情况下,部分遍历数据
···
127.0.0.1:6379> sadd myset hello world test test //sadd命令添加元素
(integer) 3
127.0.0.1:6379> smembers myset //查看指定set的所有值
- “world”
- “hello”
- “test”
127.0.0.1:6379> sismember myset test //判断某一个值是不是在set集合中
(integer) 1
127.0.0.1:6379> sismember myset test1
(integer) 0
127.0.0.1:6379>
##################################################
127.0.0.1:6379> sadd myset hello world test test
(integer)
127.0.0.1:6379> smembers myset - “world”
- “hello”
- “test”
127.0.0.1:6379> smembers myset test
(error) ERR wrong number of arguments for ‘smembers’ command
127.0.0.1:6379> sismember myset test
(integer) 1
127.0.0.1:6379> sismember myset test1
(integer) 0
127.0.0.1:6379>
##################################################
127.0.0.1:6379> scard myset //获取set集合中的元素个数
(integer) 3
##################################################
127.0.0.1:6379> srem myset hello //移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> smembers myset - “world”
- “test”
127.0.0.1:6379> srandmember myset 1 //随机抽取元素 - “test”
127.0.0.1:6379> srandmember myset 1 - “test”
127.0.0.1:6379> srandmember myset 1 - “world”
##################################################
127.0.0.1:6379> smove myset newset test #将一个指定的值,移动到另一个set集合
(integer) 1
127.0.0.1:6379> smembers newset - “test”
##################################################
127.0.0.1:6379> smembers setx - “m1”
- “m2”
- “m6”
- “m4”
127.0.0.1:6379> smembers sety - “m5”
- “m2”
- “m6”
127.0.0.1:6379> sdiff setx sety //获取两个集合中的差集 - “m1”
- “m4”
127.0.0.1:6379> sinter setx sety //获取两个集合中的交集 - “m2”
- “m6”
127.0.0.1:6379> sunion setx sety //获取两个集合中的并集 - “m6”
- “m4”
- “m1”
- “m2”
- “m5”
···
总结:
1.Redis的Set是String类型的无序集合,具有集合的无序性和唯一性。
2.由于集合通过哈希表实现,因此增删查的时间复杂度都是O(1)。
3.集合的最大成员量为2^32 -1(2的32次方减一),即单个集合可存储40亿+数据。
4.Hash(哈希)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Set就是一种简化的Hash,只变动key,而value使用默认值填充。可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。
- HSET key field value 将哈希表 key 中的字段 field 的值设为 value
。重复设置同一个field会覆盖,返回0 - HMSET key field1 value1 [field2 value2…] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
- HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
- HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
- HGET key field value 获取存储在哈希表中指定字段的值
- HMGET key field1 [field2…] 获取所有给定字段的值
- HGETALL key 获取在哈希表key 的所有字段和值
- HKEYS key 获取哈希表key中所有的字段
- HLEN key 获取哈希表中字段的数量
- HVALS key 获取哈希表中所有值
- HDEL key field1 [field2…] 删除哈希表key中一个/多个field字段
- HINCRBY key field n 为哈希表 key 中的指定字段的整数值加上增量n,并返回增量后结果 一样只适用于整数型字段
- HINCRBYFLOAT key field n 为哈希表 key 中的指定字段的浮点数值加上增量 n。
- HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。
127.0.0.1:6379> hset stu name liqi //将stu哈希表作为一个对象,设置name
(integer) 1
127.0.0.1:6379> hset stu name dazhuang //重复设置field进行覆盖,且返回0
(integer) 0
127.0.0.1:6379> hget stu name
"dazhuang" //已然被修改
127.0.0.1:6379> hset stu age 30
(integer) 1
127.0.0.1:6379> hmset stu sex 1 tel 5126541254 birth 1996 //批量设置
OK
127.0.0.1:6379> hsetnx stu name liqi //field已存在,设置失败
(integer) 0
127.0.0.1:6379> hsetnx stu email liqi@qq.com //field不存在,设置成功
(integer) 1
127.0.0.1:6379>
##################################################
127.0.0.1:6379> hexists stu name //判断key中是否存在field
(integer) 1
127.0.0.1:6379> hexists stu test
(integer) 0
127.0.0.1:6379>
##################################################
127.0.0.1:6379> hget stu name //获取key中指定的字段值
"dazhuang"
127.0.0.1:6379> hmget stu name age tel email //获取key中多个字段值
1) "dazhuang"
2) "30"
3) "5126541254"
4) "liqi@qq.com"
127.0.0.1:6379> hgetall stu //获取key中全部的key-value
1) "name"
2) "dazhuang"
3) "age"
4) "30"
5) "sex"
6) "1"
7) "tel"
8) "5126541254"
9) "birth"
10) "1996"
11) "email"
12) "liqi@qq.com"
127.0.0.1:6379>
##################################################
127.0.0.1:6379> hkeys stu //获取key中所有的field
1) "name"
2) "age"
3) "sex"
4) "tel"
5) "birth"
6) "email"
127.0.0.1:6379> hlen stu //获取key的长度
(integer) 6
127.0.0.1:6379> hvals stu //获取所有的value值
1) "dazhuang"
2) "30"
3) "1"
4) "5126541254"
5) "1996"
6) "liqi@qq.com"
127.0.0.1:6379>
##################################################
127.0.0.1:6379> hincrby stu age 1 //自增1
(integer) 32
127.0.0.1:6379> hincrby stu age 1
(integer) 33
127.0.0.1:6379> hincrbyfloat stu weight 0.5 //自增0.5 需要注意integer类型的数据不能自增float
"2.5"
127.0.0.1:6379> hincrbyfloat stu weight 0.5
"3"
127.0.0.1:6379> hkeys stu
1) "name"
2) "age"
3) "sex"
4) "tel"
5) "birth"
6) "email"
7) "weight"
127.0.0.1:6379> hdel stu sex //移除指定key中的field
(integer) 1
127.0.0.1:6379> hkeys stu
1) "name"
2) "age"
3) "tel"
4) "birth"
5) "email"
6) "weight"
小结:
Hash变更的数据user name age,尤其是用户信息之类的,经常变动的信息!Hash更适合于对象的存储,Sring更加适合字符串存储!
5.zset(有序集合)
相对于set集合来说,zset集合的每一个元素都会关联一个double类型的分数(score),有些类似于es数据库中的score字段,作为一个权重值进行排序
- ZADD key score member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
- ZCARD key 获取有序集合的成员数
- ZCOUNT key min max 计算在有序集合中指定区间score的成员数
- ZINCRBY key n member 有序集合中对指定成员的分数加上增量 n
- ZSCORE key member 返回有序集中,成员的分数值
- ZRANK key member 返回有序集合中指定成员的索引
- ZRANGE key start end 通过索引区间返回有序集合成指定区间内的成员
- ZRANGEBYLEX key min max 通过字典区间返回有序集合的成员
- ZRANGEBYSCORE key min max 通过分数返回有序集合指定区间内的成员=-inf 和 +inf分别表示最小最大值,只支持开区间()==
- ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
- ZREM key member1 [member2…] 移除有序集合中一个/多个成员
- ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
- ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
- ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
- ZREVRANGE key start end 返回有序集中指定区间内的成员,通过索引,分数从高到底
- ZREVRANGEBYSCORRE key max min 返回有序集中指定分数区间内的成员,分数从高到低排序
- ZREVRANGEBYLEX key max min 返回有序集中指定字典区间内的成员,按字典顺序倒序
- ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
- ZINTERSTORE destination numkeys key1 [key2 …] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中,numkeys:表示参与运算的集合数,将score相加作为结果的score
- ZUNIONSTORE destination numkeys key1 [key2…] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
- ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)
···
127.0.0.1:6379> zadd myzset 1 m1 2 m2 3 m3 4 m4 //添加元素
(integer) 4
127.0.0.1:6379> zcard myzset //查看zset集合中的成员个数
(integer) 4
127.0.0.1:6379> zcount myzset 0 2 //获取指定索引下的元素个数
(integer) 2
127.0.0.1:6379> zcount myzset 0 3
(integer) 3
127.0.0.1:6379> zcount myzset 0 5
(integer) 4
127.0.0.1:6379> zincrby myzset 5 m1 //自增5
“6”
127.0.0.1:6379> zscore myzset m1 //获取指定key对应的score
“6”
127.0.0.1:6379> zrank myzset m1 //获取指定key对应的字典排序
(integer) 3
127.0.0.1:6379> zrank myzset m2
(integer) 0
127.0.0.1:6379> zrange myzset 0 -1 //获取zset集合中所有的key元素
- “m2”
- “m3”
- “m4”
##################################################
127.0.0.1:6379> zrangebylex myzset - + //通过字典区间返回有序集合的成员 - “m2”
- “m3”
- “m4”
- “m1”
127.0.0.1:6379> zrangebylex myzset - + limit 0 2 //分页 - “m2”
- “m3”
127.0.0.1:6379> zrangebylex myzset - + limit 1 2 - “m3”
- “m4”
127.0.0.1:6379> zrangebylex myzset (- [m4 //通过字典区间返回有序集合的成员 - “m2”
- “m3”
- “m4”
- “m1”
127.0.0.1:6379> zrangebylex myzset (- [m3 - “m2”
- “m3”
127.0.0.1:6379> zrangebylex myzset (- [m1
(empty array)
##################################################
127.0.0.1:6379> zrangebyscore myzset 1 10 //获取指定score的成员key - “m2”
- “m3”
- “m4”
- “m1”
127.0.0.1:6379> zlexcount myzset - + //在有序集合中计算指定字典区间内成员数量
(integer) 4
127.0.0.1:6379> ZREM testset abc //移除成员abc
(integer) 1
127.0.0.1:6379> ZREMRANGEBYLEX myzset [m1 [m4 //移除字典区间[apple,java]中的所有成员
(integer) 3
127.0.0.1:6379> ZREMRANGEBYRANK myzset 0 1 // 移除排名0~1的所有成员
(integer) 2
127.0.0.1:6379> ZREMRANGEBYSCORE myzset 0 3 // 移除score在 [0,3]的成员
(integer) 2
127.0.0.1:6379> zrem myzset m1 //移除指定key
(integer) 1
127.0.0.1:6379> zrevrange myzset 0 3 //返回排序结果的 索引的0-3
- “m4”
- “m3”
- “m2”
127.0.0.1:6379> zrevrangebyscore myzset 6 2 // 按score递减顺序 返回集合中分数在[2,6]之间的成员 - “m4”
- “m3”
- “m2”
127.0.0.1:6379>
##################################################
127.0.0.1:6379> zadd mathscore 90 xm 95 xh 87 xg
(integer) 3
127.0.0.1:6379> zadd engscore 74 xm 85 xh 78 xg
(integer) 3
127.0.0.1:6379> zinterstore sumscore 2 mathscore engscore //将两个集合合并到指定集合
(integer) 3
127.0.0.1:6379> zrange sumscore 0 -1 withscores //根据key对两个score求和 - “xm”
- “164”
- “xg”
- “165”
- “xh”
- “180”
127.0.0.1:6379> zunionstore lowscore 2 matchscore engscore aggregate min //求两个集合并集的最小值并存储到lowscore
(integer) 3
127.0.0.1:6379> zrange lowscore 0 -1 withscores //查看集合中的排序结果 - “xm”
- “74”
- “xg”
- “78”
- “xh”
- “85”
127.0.0.1:6379>
···
小结:
- set排序 存储班级成绩表 工资表排序!
- 普通消息,1.重要消息 2.带权重进行判断
- 排行榜应用实现,取Top N测试
引用来源
本文参考:https://www.cnblogs.com/kylinxxx/p/13770063.html,基本上都是自己上手后写的,基于b站up主“狂神说”