03Redis-Redis入门、安装、启动、性能测试、基础知识、五大基本数据类型

文章目录

😹 作者: gh-xiaohe
😻 gh-xiaohe的博客
😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!


官网:Redis

中文网: Redis中文网CRUG

🚏 安装Redis

🚀 Windows安装Redis

🚬 1、解压安装包

在这里插入图片描述

🚬 2、开启redis-server.exe

在这里插入图片描述

🚬 3、启动redis-cli.exe测试

在这里插入图片描述
Window下使用确实简单,但是Redis 推荐我们使用Linux 去开发使用!

🚄 Linux安装Redis

🚬 1、下载安装包:redis-6.2.5.tar.gz

🚬 2、解压Redis的安装包!程序一般放在 /opt 目录下

[root@gh gh]# mv redis-6.2.5.tar.gz /opt    #移动到 opt目录下
[root@gh gh]# cd /opt
[root@gh opt]# ls
containerd  redis-6.2.5.tar.gz            
[root@gh opt]# tar -zxvf redis-6.2.5.tar.gz     #解压

🚬 3、进入解压文件后,可以看到redis的配置文件

在这里插入图片描述

🚬 4、基本的环境安装

 # yum install gcc-c++
 # gcc -v

 # 在redis目录下
 # make  # 把所有需要的文件给配置上
 
 # make install 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🚬 5、redis的默认安装路径 /usr/local/bin

cd  /usr/local/bin

在这里插入图片描述

🚬 6、将redis的配置文件,复制到我们的当前目录下

在这里插入图片描述

🚬 7、redis默认不是后台启动的,修改配置文件!

在这里插入图片描述

🚬 8、启动redis服务

通过制定的配置文件启动 redis-server gconfig/redis.conf

[root@gh bin]# redis-server gconfig/redis.conf 

🚬 9、使用redis-cli进行测试链接

[root@gh bin]# redis-server gconfig/redis.conf 
[root@gh bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> 
[root@gh bin]# ls
gconfig          jemalloc.sh  libmcrypt-config  luajit-2.0.4  mdecrypt         redis-check-aof  redis-cli       redis-server
jemalloc-config  jeprof       luajit            mcrypt        redis-benchmark  redis-check-rdb  redis-sentinel
[root@gh bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name gh
OK
127.0.0.1:6379> get name1
(nil)
127.0.0.1:6379> get name
"gh"
127.0.0.1:6379> key *
(error) ERR unknown command `key`, with args beginning with: `*`, 
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFbx9Ll5-1662466094734)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

🚬 10、查看redis 的进程是否开启

在这里插入图片描述

🚬 11、关闭redis服务 shutdown

在这里插入图片描述

🚏 启动Redis

[root@gh ~]# cd  /usr/local/bin
[root@gh bin]# redis-server gconfig/redis.conf 
[root@gh bin]# redis-cli -p 6379

********* 关闭  ***************
shutdown
exit

🚏 测试性能

redis-benchmark: Redis官方提供的性能测试工具,参数选项如下:

在这里插入图片描述
测试

测试 100个并发链接 100000请求
[root@gh /]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XvvgQvUF-1662466886056)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

🚏 基础知识

🚬 redis默认有16个数据库,默认使用的是第0个

在这里插入图片描述

🚬 1、可以使用select 进行切换数据库

127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> 

🚬 2、查看数据库大小 dbsize

127.0.0.1:6379[3]> dbsize
(integer) 0
127.0.0.1:6379[3]> set name gh
OK
127.0.0.1:6379[3]> dbsize
(integer) 1
127.0.0.1:6379[3]> 

🚬 3、查看所有得key keys *

🚬 4、清空当前数据库 flushdb

🚬 5、清空全部数据库内容 flushall

🚬 6、redis是单线程的

    redis很快 ,redis基于内存操作cpu 不是redis性能瓶颈 ,redis的瓶颈是根据机器的内存和网络带宽 ,既然可以使用单线程来实现,就使用单线程。

    redis是c语言写的,官方数据是100000+的QPS ,这个不必同样使用key-value的Memecache差

🚬 7、redis为什么单线程还这么快

  • 误区一:高性能的服务器一定是多线程的?
  • 误区二:多线程(cpu上下文切换)一定比单线程高!

🚬 8、核心:

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

💒 Redis-五大基本数据类型

redis中文网更多命令可以参考
在这里插入图片描述

🚀 Redis-key

在这里插入图片描述

🚄 一、string(字符串)类型

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

🚬 incr/decr 步长 i+=/i-= incrby/decrby

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views   # 浏览量 + 1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views   # 浏览量 - 1
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> INCRBY views 10  # 浏览量 + 10 
(integer) 11
127.0.0.1:6379> get views
"11"
127.0.0.1:6379> DECRBY views 10  # 浏览量 - 10 
(integer) 1
127.0.0.1:6379> get views
"1"

🚬 对象

    set user2 {name:lisi,age:3} # 设置一个user:2 对象 值为json 字符串来保存对象

127.0.0.1:6379> set user2 {name:lisi,age:3}
OK
127.0.0.1:6379> get user2
"{name:lisi,age:3}"

    这里的key是一个巧妙的设计: user:{id}:{filed},如此设计在redis中是完全OK

127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"

🚬 String类型的使用的场景:

  • value除了是我们的字符串还可以是我们的数字!

    • 计数器

    • 统计多单位的数量

    • 对象缓存存储

    • 粉丝数

🚒 二、List(列表)类型

  • 可以存储重复的值
  • 所有的list命令都是以 l 开头的
  • 应用: 在redis里面,我们可以把list玩成栈,堆、队列、阻塞队列!

在这里插入图片描述

在这里插入图片描述

🚬 lrem 移除指定的值

127.0.0.1:6379> lrange list 0 -1   # 可以存在相同的值
1) "1"
2) "6"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
127.0.0.1:6379> lrem list 1 2     # 移除一个 2   移除list集合中制定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "6"
3) "5"
4) "4"
5) "3"
6) "1"
127.0.0.1:6379> lrem list 2 1    # 移除两个 1
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "6"
2) "5"
3) "4"
4) "3"

🚬 rpoplush 移除列表的最后一个元素,将他移动到新的列表中

127.0.0.1:6379> lrange list 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
127.0.0.1:6379> rpoplpush list mylist # 将list中的字符串,移除要新的列表中
"hello3"
127.0.0.1:6379> lrange list 0 -1  # 查看原来的列表
1) "hello1"
2) "hello2"
127.0.0.1:6379> lrange mylist 0 -1 # 查看目标列表中,确实存在该值
1) "hello3"

🚬 lset 将列表中制定下标的值替换为另一个值,更新操作

127.0.0.1:6379> exists list         # 判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item    # 如果不存在列表我们去更新就会报错
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item    # 如果存在,更新当前下表的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"
127.0.0.1:6379> lset list 1 0 ther  # 如果不存在,则会报错  
(error) ERR wrong number of arguments for 'lset' command

🚬 linsert 将value插入到 列表 中某个元素的前面或者后面

linsert before/after “字符串” 内容

127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "word"
127.0.0.1:6379> linsert list before word one  # 在 word 的前面赠加一个 one
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "one"
3) "word"
127.0.0.1:6379> linsert list after  word two # 在 word 的后面赠加一个 two 
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "one"
3) "word"
4) "two"

🚬 小结

  • 实际上是一个双向链表 before Node after ,left ,right 都可以插入值
  • key不存在,创建新链表
  • 如果key 存在,新增内容
  • 移除所有元素,空链表也代表不存在
  • 在两边插入或者改动值,效率高,中间元素,相对效率低

消息队列(Lpush Rpop),栈 (Lpush Lpop)

🚤 三、Set(集合)类型

  • set无序不重复集合
  • set的命令都是以s开头
    在这里插入图片描述

🚬 1、像set 中添加 值 sadd

🚬 2、查看的set中的全部值 smembers

🚬 3、判断 值 是否在 set 集合中 sismember

    smember 网络释义:查询特定值是否存在

127.0.0.1:6379> sadd set hello1       # set 结合中添加 值
(integer) 1
127.0.0.1:6379> sadd set hello2
(integer) 1
127.0.0.1:6379> sadd set hello3
(integer) 1
127.0.0.1:6379> smembers set          # 查看指定set的 所有值  
1) "hello1"
2) "hello3"
3) "hello2"
127.0.0.1:6379> sismember set hello1  # 判断某一个值是不是在set集合中  
(integer) 1                             存在 返回 1
127.0.0.1:6379> sismember set word    
(integer) 0                             不存在 返回 0   

🚬 4、获取set集合中的个数 scard

127.0.0.1:6379> scard set   # 获取 set 集合中的内容元素的个数
(integer) 3
127.0.0.1:6379> sadd set 12306
(integer) 1
127.0.0.1:6379> esembers set
1) "hello1"
2) "hello3"
3) "hello2"
4) "12306"
127.0.0.1:6379> scard set
(integer) 4

🚬 5、移除set 集合中的指定元素 srem

127.0.0.1:6379> smembers set 
1) "hello1"
2) "hello3"
3) "hello2"
4) "12306"
127.0.0.1:6379> srem set hello3   # 移除set 中指定的元素
(integer) 1
127.0.0.1:6379> scard set
(integer) 3
127.0.0.1:6379> smembers set
1) "hello1"
2) "hello2"
3) "12306"

🚬 6、set 无序不重复集合,随机抽取 srandmember

127.0.0.1:6379> smembers myset
1) "k4"
2) "k3"
3) "k1"
4) "k2"
127.0.0.1:6379> SRANDMEMBER myset   # 随机抽取一个元素
"k4"
127.0.0.1:6379> SRANDMEMBER myset
"k2"
127.0.0.1:6379> SRANDMEMBER myset
"k4"
127.0.0.1:6379> SRANDMEMBER myset
"k3"
127.0.0.1:6379> SRANDMEMBER myset 2 # 随机抽取两个元素
1) "k1"
2) "k2"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "k3"
2) "k4"

🚬 7、随机删除set 集合中的元素 spop

127.0.0.1:6379> smembers myset
1) "k4"
2) "k3"
3) "k1"
4) "k2" 
127.0.0.1:6379> spop myset   # 随机删除set 集合中的元素
"k2"
127.0.0.1:6379> spop myset 
"k4"
127.0.0.1:6379> smembers myset
1) "k3"
2) "k1"

🚬 8、将指定的一个值,移动到另外一个set集合中 smove

127.0.0.1:6379> smembers set
1) "hello1"
2) "hello3"
3) "hello2"
127.0.0.1:6379> smembers myset
1) "hello4"
127.0.0.1:6379> smove set myset hello2  # 将指定的值,移动到另外一个set集合
(integer) 1
127.0.0.1:6379> smembers set
1) "hello1"
2) "hello3"
127.0.0.1:6379> smembers myset
1) "hello4"
2) "hello2"

🚬 9、数字类型集合 差集 SDIFF、交集 SINTER、并集 SUNION

127.0.0.1:6379> smembers k1
1) "v3"
2) "v1"
3) "v2"
127.0.0.1:6379> smembers k2
1) "v2"
2) "v4"
127.0.0.1:6379> SDIFF k1 k2  # 差集
1) "v1" 
2) "v3"
127.0.0.1:6379> SINTER k1 k2 # 交集
1) "v2"
127.0.0.1:6379> SUNION k1 k2 # 并集
1) "v1"
2) "v3"
3) "v2"
4) "v4"

🚬 应用场景

    微博,将a用户所有关注的人放在一个集合中,将他的粉丝也放在一个集合中!共同关注,共同爱好

🚗 四、Hash(哈希)类型

  • Map集合 key -<key,value> key - map 值是map集合
  • Hash的命令都是以l开头
  • 本质: 和String 没有太大的区别,还是简单的key - value 不过是value 变成了一个 map

在这里插入图片描述

🚬 1、设置和获取hash的值 hset hget

🚬 2、设置多个 和 获取多个 hash 的值 hmset hmget

🚬 3、获取全部的数据 hgetall

🚬 4、删除hash指定的字段!对应的value也随之消失 hdel

127.0.0.1:6379> hset myhash k1 v1        # set 一个具体的 key-value
(integer) 1
127.0.0.1:6379> hget myhash k1           # 获取一个字段值 
"v1"
127.0.0.1:6379> hmset myhash k1 v2 k2 v3 # set 多个 key-value
OK
127.0.0.1:6379> hmget myhash k1 k2       # 获取多个 字段值
1) "v2"
2) "v3"
127.0.0.1:6379> hgetall myhash           # 获取全部的数据
1) "k1"
2) "v2"
3) "k2"
4) "v3"
127.0.0.1:6379> hdel myhash k1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "k2"
2) "v3"

🚬 5、获取hash表的字段数量 hlen

127.0.0.1:6379> hgetall myhash
1) "k2"
2) "v3"
3) "k1"
4) "v1"
127.0.0.1:6379> hlen myhash
(integer) 2

🚬 6、判断hash中指定字段是否存在! hexists

127.0.0.1:6379> HEXISTS myhash k1 
(integer) 1
127.0.0.1:6379> HEXISTS myhash k3
(integer) 0

🚬 7、只获得所有的key 只获得所有的value hkeys / hvals

127.0.0.1:6379> hgetall myhash
1) "k2"
2) "v3"
3) "k1"
4) "v1"
127.0.0.1:6379> hkeys myhash   # 只获取所有的flield
1) "k2"
2) "k1"
127.0.0.1:6379> hvals myhash   # 只获获取所有的value
1) "v3"
2) "v1"

🚬 8、hincrby hdecrby hsetnx

127.0.0.1:6379> hgetall myhash
1) "k1"
2) "1"
3) "k2"
4) "3"
127.0.0.1:6379> HINCRBY myhash k1 3     # 指定增量
(integer) 4
127.0.0.1:6379> HGETALL myhash
1) "k1"
2) "4"
3) "k2"
4) "3"
127.0.0.1:6379> hsetnx myhash k3 hello   # 如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash k3 hello   # 如果存在不能设置
(integer) 0

🚬 9、存储对象

127.0.0.1:6379> hmset user:2 name zhangsan age 12  student idea
OK
127.0.0.1:6379> hmget user:2 name age student
1) "zhangsan"
2) "12"
3) "idea"
127.0.0.1:6379> hgetall user:2
1) "name"
2) "zhangsan"
3) "age"
4) "12"
5) "student"
6) "idea"

🚬 小结

    Hash变更数据 User Name Age,尤其是Hash变更数据 。经常变动的信息!Hash更适合对象的存储,String 更适合字符串的存储

🚲 五、Zset(有序结合)类型

在这里插入图片描述

🚬 1、添加一个值 zadd

🚬 2、查看Zset中的数据 zrange

127.0.0.1:6379> zadd myset 1 one         # 添加一个值
(integer) 1 
127.0.0.1:6379> zadd myset 2 two 3 three # 添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"

🚬 3、从小到大排序 带 【参数】 zrangebyscore 【withsocres】

🚬 4、从大到小排序 带 【参数】zrevrange 【withsocres】

127.0.0.1:6379> zadd salary 2500 xiaoming   #添加三个用户
(integer) 1
127.0.0.1:6379> zadd salary 500 zhangfei
(integer) 1
127.0.0.1:6379> zadd salary 3000 lisi  
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf  # 显示全部的用户 从小到大
1) "zhangfei"
2) "xiaoming"
3) "lisi"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 显示全部的用户 从小到大 并带薪水
1) "zhangfei"
2) "500"
3) "xiaoming"
4) "2500"
5) "lisi"
6) "3000"
127.0.0.1:6379> ZREVRANGE salary 0 -1  # 显示全部的用户 从大到小  
1) "lisi"
2) "xiaoming"
3) "zhangfei"
127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores  # 显示全部的用户 从大到小  并带薪水
1) "lisi"
2) "3000"
3) "xiaoming"
4) "2500"
5) "zhangfei"
6) "500"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores  显示工资小于 2500 员工的升序排序
1) "zhangfei"
2) "500"
3) "xiaoming"
4) "2500"

🚬 5、移除Zset中的元素 zrem

🚬 6、获取有序集合Zset中的个数 zcard

127.0.0.1:6379> zrange salary 0 -1
1) "zhangfei"
2) "xiaoming"
3) "lisi"
127.0.0.1:6379> zcard salary          # 获取zset集合中的个数
(integer) 3
127.0.0.1:6379> zrem salary xiaoming  # 移除zset集合中的元素
(integer) 1
127.0.0.1:6379> zcard salary
(integer) 2

🚬 7、获取定区间的成员变量 zcount

127.0.0.1:6379> zrange myset 0 -1
1) "hello"
2) "word"
3) "haerbin"
127.0.0.1:6379> zcount myset 1 3  # 获取指定区间的成员数量!
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
127.0.0.1:6379> zcount myset 2 3
(integer) 2

🚬 案例思路:

    set 排序,存储班级成绩表,工资表排序 、排行榜应用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gh-xiaohe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值