Redis的5大基本数据类型以及基本命令

Redis 基本命令

  1. select index:查看数据库

    image

  2. set [key,value] ,get key:操作当前数据库

    image

  3. flushdb:清除当前库的所有数据
    image

  4. flushall:清楚所有数据库的内容

    image

  5. exists: 判断某个Key值是否存在,存在返回条数,不存在返回0

    image

  6. expire:设置Key的过期时间 ttl:查看Key的生于过期时间

    给Key为name的属性设置20秒的过期时间 直接expire name 20,如果过期此属性就会被删除

    image

  7. Redis为什么单线程还这么快???

    1. 误区1.高性能的服务器一定是多线程的?

    2. 误区2.多线程(会产生CPU上下文切换)一定比单线程效率高!!

    核心:redis是将大部分数据放进内存中,所以说使用单线程去操作效率是最高的,多线程(CPU 上下文切换:耗时长),对于内存系统说,如果没有上下文切换效率是最高的!多次读写都在一个CPU上,在内存情况下,这个就是最佳方案。

五大数据类型

image

翻译:

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-Key

127.0.0.1:6379> flushall  # 清楚库里面的所有数据
OK
127.0.0.1:6379> select 1  #切换数据库
OK
127.0.0.1:6379[1]> set name wangyapeng  #存储key和值
OK
127.0.0.1:6379[1]> keys * #查看当前库中的所有key
1) "name"
127.0.0.1:6379[1]> exists name #查看key为name在本库中是否存在
(integer) 1
127.0.0.1:6379[1]> set age 45
OK
127.0.0.1:6379[1]> keys *
1) "age"
2) "name"
127.0.0.1:6379[1]> move name 0  #将key为name的数据移动到下标为0的数据库中去
(integer) 1
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "age"
127.0.0.1:6379[1]> set name peng
OK
127.0.0.1:6379[1]> EXPIRE name 20 #设置过期时间
(integer) 1
127.0.0.1:6379[1]> ttl name #查看剩余过去时间
(integer) 7
127.0.0.1:6379[1]> ttl name
(integer) 1
127.0.0.1:6379[1]> ttl name
(integer) -2
127.0.0.1:6379[1]> ttl name
(integer) -2
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> keys *
1) "age"

String

####################################################
127.0.0.1:6379[1]> FLUSHDB #清空库中的信息
OK
127.0.0.1:6379[1]> set key1 v1 #set key
OK
127.0.0.1:6379[1]> APPEND key1 " hello" #向key1后面拼接,如果key不存在就会直接新建一个key
(integer) 8
127.0.0.1:6379[1]> strlen key1 #查看key的长度
(integer) 8
127.0.0.1:6379[1]> get key1 #获得当前key
"v1 hello"
#####################################################
127.0.0.1:6379[1]> set num 0
OK
127.0.0.1:6379[1]> get num
"0"
127.0.0.1:6379[1]> INCR num  #自增1
(integer) 1
127.0.0.1:6379[1]> incr num
(integer) 2
127.0.0.1:6379[1]> get num
"2"
127.0.0.1:6379[1]> decr num  #自减1
(integer) 1
127.0.0.1:6379[1]> get num
"1"
# 步长
127.0.0.1:6379> incrby num 3  #每一次增加指定的步数 
(integer) 3
127.0.0.1:6379> incrby num 3
(integer) 6
127.0.0.1:6379> get num
"6"
127.0.0.1:6379> decrby num 2  #每一次减少指定的步数
(integer) 4
127.0.0.1:6379> decrby num 2
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> 

#####################################################
127.0.0.1:6379> get name
"wangyapeng"
127.0.0.1:6379> GETRANGE name 2 5  #截取字符串
"ngya"
127.0.0.1:6379> GETRANGE name 0 -1 #获取全部字符串和 get key一样
"wangyapeng"
127.0.0.1:6379> setrange name 2 `` #替换字符串
(integer) 10
127.0.0.1:6379> get name
"wa``yapeng"
## setex(set with expire)  # 设置过期时间
## setnx(set if not exist  ) # 不存在在设置(分布式锁中经常使用)
127.0.0.1:6379> setex key3 30 "HelloWorld" # 设置key 并且设置30秒的过期时间
OK
127.0.0.1:6379> ttl key3
(integer) 25
127.0.0.1:6379> get key3
"HelloWorld"
127.0.0.1:6379> setnx mykey "redis" # 如果key不存在就设置当前key
(integer) 1
127.0.0.1:6379> keys *
1) "num"
2) "mykey"
3) "name"
127.0.0.1:6379> setnx mykey "mongDB"  # 此时key存在了,无法设置保留原来的值返回0
(integer) 0
127.0.0.1:6379> get mykey
"redis"

#####################################################
# mset
# mget
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4 # 同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k4"
2) "k2"
3) "k1"
4) "k3"
127.0.0.1:6379> mget k1 k2 k3 # 同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 k4 k5 v5 # msetnx 是原子性操作,要么一起成功,要么一起失败
(integer) 0

#####################################################
--------------- getset #先获取在修改,如果不存在就添加,返回的是获取的值-----------------
127.0.0.1:6379> getset db "redis"  # 不存在添加
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db relice  #存在先获取原来的值后修改
"redis"
127.0.0.1:6379> get db
"relice"
#####################################################

List

基本数据类型,列表
image

在redis中,我们可以把List看成栈、队列、阻塞队列

###############################################################
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> lpush list one  # lpush 讲一个值或多个值插入到列表的头部(左)
(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> lpush list four
(integer) 4
127.0.0.1:6379> lrange list 0 -1  # 通过区间去获取具体的值
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrange list 0 1 
1) "four"
2) "three"
127.0.0.1:6379> Rpush list right   # Rpush 将一个值或多个值插入到列表的尾部(右)
(integer) 5
127.0.0.1:6379> lrange list 0 -1 
1) "four"
2) "three"
3) "two"
4) "one"
5) "right"
127.0.0.1:6379> 

###############################################################
--- 移除元素 ---
LPOP
RPOP

127.0.0.1:6379> lpop list  # 移除左面第一个元素
"four"
127.0.0.1:6379> rpop list # 移除右面第一个元素
"right"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
###############################################################
--- 根据下标查看元素 Lindex  ---
--- 查看列表的长度 llen ---
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lindex list 1  #通过下标获取某一个值
"two"
127.0.0.1:6379> lindex list 0
"three"
127.0.0.1:6379> llen list    # 查看列表的长度
(integer) 3

###############################################################
--- 移除指定的值  lrem  ---

127.0.0.1:6379> lrem list 1 one  # 删除某一个元素,可以指定元素的个数
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush list one
(integer) 3
127.0.0.1:6379> lpush list one
(integer) 4
127.0.0.1:6379> lpush list one
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "one"
3) "one"
4) "three"
5) "two"
127.0.0.1:6379> lrem list 2 one
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "three"
3) "two"
###############################################################
--- 截断一个值 ltrim ---

127.0.0.1:6379> lpush mylist hello1
(integer) 1
127.0.0.1:6379> lpush mylist hello2
(integer) 2
127.0.0.1:6379> lpush mylist hello3
(integer) 3
127.0.0.1:6379> lpush mylist hello4
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello4"
2) "hello3"
3) "hello2"
4) "hello1"
127.0.0.1:6379> ltrim mylist 1 2  # 通过下标截取指定的长度,这个list已经被改变了,截断就只剩下截取的元素
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello3"
2) "hello2"
###############################################################
--- 移除列表的最后一个元素 rpoplpush ---
127.0.0.1:6379> lpush mylist world
(integer) 1
127.0.0.1:6379> lpush mylist world1
(integer) 2
127.0.0.1:6379> lpush mylist world2
(integer) 3
127.0.0.1:6379> rpoplpush mylist motherlist #移除最后一个元素到一个新的列表中
"world"
127.0.0.1:6379> lrange mylist
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange mylist 0 -1
1) "world2"
2) "world1"
127.0.0.1:6379> lrange motherlist 0 -1
1) "world"
127.0.0.1:6379> 

###############################################################
--- 根据下标修改元素 lset ---
127.0.0.1:6379> lset list 0 item #要想使用这个命令必须确保当前Key存在
(error) ERR no such key
127.0.0.1:6379> lpush list world
(integer) 1
127.0.0.1:6379> lrange list 0 0 #查看列表的值
1) "world"
127.0.0.1:6379> lset list 0 item # 如果存在 就会进行更新 
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> lset list 1 myworld # 只能更新列表中已经存在的值
(error) ERR index out of range
127.0.0.1:6379> 

###############################################################
---  在元素之前或者之后插入元素 linsert ---

127.0.0.1:6379>  linsert list before item hello
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "item2"
2) "item1"
3) "hello"
4) "item"
127.0.0.1:6379>  linsert list after item hello  # 在元素item之后添加元素 hello
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "item2"
2) "item1"
3) "hello"
4) "item"
5) "hello"
127.0.0.1:6379> 

###############################################################

小结

  • 它实际上是一个链表 before Node after ,left、right 都可以插入
  • 如果key不存在,就得新增列表
  • 如果key存在,新增内容
  • 如果移除了所有的值,空链表,也是不存在
  • 在两边插入或者改动值效率最高

它可以当做一个消息队列(左进右出),也可以是一个栈(先进后出)

Set

###############################################################
--- 向set集合中添加元素 sadd ---
--- 查看set中的成员 sMembers  查看set中的成员是否存在 SISMEMBER---

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> sadd myset peng
(integer) 1
127.0.0.1:6379> sMembers myset  #查看set集合中的成员
1) "hello"
2) "world"
3) "peng"
127.0.0.1:6379> SISMEMBER myset peng  #查看集合中是否存在此成员 存在返回 1 不存在 0 
(integer) 1
127.0.0.1:6379> SISMEMBER myset wang
(integer) 0
###############################################################	
--- 获取set集合中的个数 scard  ---

127.0.0.1:6379> SCARD myset # 获取set集合中的个数
(integer) 3
###############################################################
--- 移除元素 srem ---

127.0.0.1:6379> SCARD myset 
(integer) 3
127.0.0.1:6379> srem myset hello #从set集合中移除元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "peng"

###############################################################	
--- set是无需不重复集合 ---
--- 随机从集合中取出一个元素 srandmember ---
127.0.0.1:6379> smembers myset
1) "world"
2) "peng"
127.0.0.1:6379> srandmember myset #随机从集合中取出一个元素 存在偶然性
"world"
127.0.0.1:6379> srandmember myset
"world"
127.0.0.1:6379> srandmember myset
"peng"
127.0.0.1:6379> srandmember myset 2  #随机从集合中取出指定个数的元素 存在偶然性
1) "world"
2) "peng"

###############################################################
--- 随机删除集合中的元素 spop ---
127.0.0.1:6379> smembers mylist
1) "test1"
2) "test2"
3) "test3"
4) "test5"
5) "test6"
6) "test4"
127.0.0.1:6379> spop mylist #随机删除集合中的元素
"test1"
127.0.0.1:6379> spop mylist
"test3"
127.0.0.1:6379> spop mylist
"test2"
127.0.0.1:6379> smembers mylist
1) "test5"
2) "test6"
3) "test4"

###############################################################	
--- 将一个元素移动到新的set集合中 smove ---
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset hello1
(integer) 1
127.0.0.1:6379> sadd myset2 wang
(integer) 1
127.0.0.1:6379> smove myset myset2 hello # 将myset集合中的hello元素移动到myset2中
(integer) 1
127.0.0.1:6379> smembers myset
1) "hello1"
127.0.0.1:6379> smembers myset2
1) "hello"
2) "wang"


###############################################################	
微博 B站 共同关注,QQ共同好友
数学集合并
 - 交集  SINTER
 - 并集  SUNION
 - 差集  SDIFF
 
 127.0.0.1:6379> SDIFF key1 key2 # 差集
1) "c"
127.0.0.1:6379> SINTER key1 key2 # 交集
1) "b"
2) "a"
3) "f"
127.0.0.1:6379> SUNION key1 key2 # 并集
1) "c"
2) "b"
3) "f"
4) "a"
5) "e"

Hash

Map集合,key-map的时候这个值是一个map集合!本质和String没有太大区别。还是Key-value!

--- 设置集合hset 获取集合hget ---
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset myHash key1 hahahha  #添加一个集合
(integer) 1
127.0.0.1:6379> hget myHash key1 # 根据key获取集合元素
"hahahha"
127.0.0.1:6379> hmset myHash key2 lalalala key3 balabalabala key4 abaabaaba # 批量在集合里面添加多个值
OK
127.0.0.1:6379> hmget myHash key1 key2 key3 # 根据key批量获取元素
1) "hahahha"
2) "lalalala"
3) "balabalabala"
127.0.0.1:6379> hgetall myHash  #根据集合的key获取全部元素
1) "key1"
2) "hahahha"
3) "key2"
4) "lalalala"
5) "key3"
6) "balabalabala"
7) "key4"
8) "abaabaaba"
###############################################################	
--- 删除元素 hdel ---
127.0.0.1:6379> hdel myHash key1 # 根据元素的key删除元素
(integer) 1
127.0.0.1:6379> hgetall myHash
1) "key2"
2) "lalalala"
3) "key3"
4) "balabalabala"
5) "key4"
6) "abaabaaba"
127.0.0.1:6379> 
###############################################################	
--- 获取集合的长度 hlen ---
127.0.0.1:6379> hgetall myHash 
1) "key2"
2) "lalalala"
3) "key3"
4) "balabalabala"
5) "key4"
6) "abaabaaba"
127.0.0.1:6379> hlen myHash  # 获取集合的长度
(integer) 3
###############################################################	
--- 判断key是否存在于集合  HEXISTS---
127.0.0.1:6379> HEXISTS myHash key4
(integer) 1
127.0.0.1:6379> HEXISTS myHash key5 # 判断key是否存在于集合
(integer) 0
###############################################################
- 只获取key  hkeys
- 只获取values  hvals
127.0.0.1:6379> hkeys myHash
1) "key2"
2) "key3"
3) "key4"
127.0.0.1:6379> hvals myHash
1) "lalalala"
2) "balabalabala"
3) "abaabaaba"

###############################################################	
-自增 HINCRBY
-自减
127.0.0.1:6379> HINCRBY myHash key5 2 # 每次增加2
(integer) 3
127.0.0.1:6379> HINCRBY myHash key5 2
(integer) 5
127.0.0.1:6379> hsetnx myHash key6 hello123  #是否存在 存在0 不存在 1可以添加元素
(integer) 1
127.0.0.1:6379> hsetnx myHash key6 hello123
(integer) 0
127.0.0.1:6379> hset user:1 name wang
(integer) 1
127.0.0.1:6379> hget user:1 name
"wang"
127.0.0.1:6379> hset user:1 name wangyapeng 
(integer) 0
127.0.0.1:6379> hset user:1 age 22
(integer) 1
127.0.0.1:6379> hset user:1 age 22 addre shanghai
(integer) 1
127.0.0.1:6379>  hget user:1 addre
"shanghai"

Hash更适合于对象的存储,String更适合字符串存储

Zset(有序集合)

在set的基础上增加了一个值,set key1 v1,zset k1 score1 v1

--- 添加一个zset集合 zadd

127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two 3 three 4 four  #添加多个元素
(integer) 3
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
############################################################
---- 排序如何实现? ————
127.0.0.1:6379> zadd salary 10000 xiaohong 2000 zhangsan 5000 peng  #添加zset元素
(integer) 3  
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 从小到大进行排序
1) "zhangsan"
2) "peng"
3) "xiaohong"
# ZRANGEBYSCORE key min max,只能取最小值到最大值之间的数据
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores #从小到大排序并显示元素的值
1) "zhangsan"
2) "2000"
3) "peng"
4) "5000"
5) "xiaohong"
6) "10000"
127.0.0.1:6379> zrevrange salary 0 -1   #从大到小排序
1) "xiaohong"
2) "zhangsan"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 1000 withscores
(empty array)
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 withscores # 取负无穷到5000之间的元素,从小到大排序并显示元素的值
1) "zhangsan"
2) "2000"
3) "peng"
4) "5000"

############################################################
--- zrem  从zset集合中移除元素 
127.0.0.1:6379> zrange salary 0 -1 # 查看集合中的元素
1) "zhangsan"
2) "peng"
3) "xiaohong"
127.0.0.1:6379> zrem salary peng  # 移除元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zhangsan"
2) "xiaohong"
127.0.0.1:6379> zcard salary # 查看集合中元素的个数
(integer) 2
############################################################
 --- 获取成员之间的成员数量 zcount ---
127.0.0.1:6379> zadd myzset 1 helloworld
(integer) 1
127.0.0.1:6379> zadd myzset 2 testmyset 3 parper 4 foure
(integer) 3
127.0.0.1:6379> zcount myzset 1 4 # 获取成员之间的成员数量
(integer) 4
127.0.0.1:6379> zcount myzset 1 2 
(integer) 2
127.0.0.1:6379> zcount myzset 2 3
(integer) 2

案例思路:

  • set排序

  • 存储班级成绩考试成绩

  • 排行榜应用实现

posted @ 2022-02-24 21:35  Primary丶  阅读(111)  评论(0编辑  收藏  举报