Redis入门篇学习笔记一

1.官方中文文档

http://www.redis.cn/

2.linux下安装

  • 官网下载安装包 redis-6.0.6.tar.gz

  • 放到服务器的usr/local/redis目录下

  • 解压:tar -zxvf redis-6.06.tar.gz

  • 在redis目录下进行基本的环境安装:yum install gcc-c++

  • 检查gcc的版本:gcc -v

  • 在redis目录下执行make(若报错可能是gcc的版本问题)

  • 执行make install

  • 进入/usr/local/bin目录,这是redis的默认安装目录。在这个目录创建一个myredisconfig的文件夹。然后将/usr/local/redis/redis-6.0.6下的redis.conf拷贝到这个文件夹下

  • 设置为后台自动启动:修改myredisconfig目录下的redis.conf daemonize no改为daemonize yes,然后:wq!保存退出

  • 通过配置文件启动redis(在/usr/local/bin目录下)

redis-server myredisconfig/redis.conf

  • redis客户端测试连接

    redis-cli -p 6379

    ping

  • 退出redis

shutdown

exit

  • 查看redis进程

ps -ef|grep redis

3.安装出现的问题

  • 在安装redis6以上的版本时make命令会出现错误,原因是gcc版本太低(centos默认版本为4),可以选择安装低版本redis5或者升级gcc到8版本,通过gcc -v命令查看版本.
  • 升级gcc版本的方法

https://www.cnblogs.com/jixiaohua/p/11732225.html

4. 压力测试工具

redis-benchmark是官方自带的性能测试工具,可以有效的测试redis服务的性能。在bin目录下。

测试demo:

测试100个并发连接,10000个请求,检测host为localhost 端口为6379的redis服务器性能。

redis-benchmark -h localhost -p 6379 -c 100 -n 10000

相关参数说明:

5. 基本的数据库命令

  • redis命令手册:https://redis.com.cn/commands.html

  • redis默认有16个数据库 0~15,默认使用第0个。

    查看redis.conf可以得知:

  • 进入redis:redis-server myredisconfig/redis.conf redis-cli -p 6379

  • 退出redis:shutdown exit

  • 切换数据库:select n n表示第几个数据库

  • 查看当前数据库的key的数量:dbsize

  • 查看具体的key:key *

  • 清空当前库:flushdb

  • 清空全部的库:flushall

  • 设置key值:set name coderchen

  • 获取key值:get name

  • 查看 key是否存在:exists keyname例如 exists name

  • 设置key生存时间当key过期会被自动删除:expire key 秒数

  • 查看还有多少秒过期:ttl name -1表示永不过期,-2表示已经过期。

  • 查看key的类型:type key

  • 删除key: del key

注意:redis命令不区分大小写,但是记录的数据区分大小写

  • 为什么redis默认端口是6379?

https://www.zhihu.com/question/20084750

6. redis单线程快?

  • 为什么redis是单线程?

redis是基于内存的操作,cpu不是redis的瓶颈,redis的瓶颈是机器内存大小或者网络带宽。既然单线程容易实现而且cpu不会成为瓶颈,那么就顺理成章的采用单线程的方案了。redis是C语言编写的,官方数据可以达到100000+QPS(每秒查询次数)

  • redis为什么这么快?

并不是多线程一定比单线程快,效率高。这与cpu,内存,硬盘的速度有关。

redis单线程快是因为redis是基于内存的操作。单线程效率最高,因为多线程的本质就是cpu模拟多个线程的情况,这其中有一个大的开销就是cpu上下文的切换。而redis单线程对内存中的数据进行读写时,速度比较快。举个例子就是读取1MB的数据时,可能多个进程cpu上下文的切换时间就大于单个进程读取数据的时间

key值加引号和不加的区别?

7.字符串String(单值单value)

  • string是redis 的基本类型,一个key对应一个value。string类型是二进制安全的,即redis的string可以包含任何数据,比如jpg图片或者序列化的对象,string类型redis最基本的数据类型,一个redis中字符串value最多可以是512M
常用命令说明:

官方命令手册:https://redis.com.cn/commands.html

string数据结构是简单的key-value类型,value不仅可以是string,也可以是数字

  • append key1 "hello":对不存在的key进行append,等同于set key1 "hello"

  • append key1 ",world":对已经存在的key append就是在后面追加。

  • strlen key1:获取字符串长度

  • set views 0:要设置为数字才能用incr,decr命令 ,本质上这是一个字符串操作,因为Redis没有专门的整数类型。存储在 key 中的字符串被转换为十进制有符号整数
  • incr views:执行一次就将key中存储 的数字值增一
  • decr views:执行一次就将key中存储的数字值减一
  • incrby views 10:执行一次key中存储的值+10
  • decrby views 10:执行一次key中存储的值-10

  • getrange key2 m n:获取[m,n]区间范围内的字符串。n可以为负数,表示偏移,-1 表示最后一个字符, -2 表示倒数第二个字符,以此类推。

  • setrange key2 n value:将key2的值从第n个开始替换为指定的value

  • setex key2 10 "hello":将key2的值设置为hello,并且key2的生存时间设置为10s。这个命令等价于set key2 "hello" expire key2 10区别是setex 命令是一个原子操作,在同一时间内完成设置值和设置过期时间这两个操作。

  • setnx key3 "redis":在指定的key不存在时,为key设置指定的值,这种情况下等同于set,当key存在时,什么也不做。返回值:0 被设置了 1 没有被设置。

  • mset key1 value1 key2 value2 ......keyn valuen:设置多个key和value,如果这其中已经存在key,则会覆盖掉。
  • mget key1 key2 ...keyn:返回所有给定的key的值
  • msetnx key1 value1 key2 value2 ...keyn valuen:设置多个 key value,当且仅当所有给定的健都不存在时,即使有一个健存在值,msetnx也会拒绝执行操作。

  • getset key value:将key的值修改为value,并返回在修改之前的值。如果key在执行这个命令前不存在,则返回nil。

  • 可以用来缓存对象

mset user:1:name zhangsan user:1:age 2

mget user:1:name user:1:age

应用
  • 微博数,粉丝数等

8. 列表List(单值多value)

  • redis的列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)
  • 它的底层就是一个链表
常用命令说明

官方命令手册:https://redis.com.cn/commands.html

  • lpush list "one":将值插入到列表的头部(左边)
  • rpush list "two":将值插入到列表的尾部(右边)
  • lrange list n m:返回指定区间的元素 [n,m] m为-1表示返回n后面所有的元素。

  • lpop list:移除并返回列表的第一个元素,左边的第一个
  • rpop list:移除并返回列表的最后一个元素,右边第一个。

  • lindex list n:按照索引下标n获得元素(-1代表最后一个,0表示第一个,以此类推)


  • llen list:返回列表的长度


  • lrem list n value:移除列表中与value相等的元素,移除n个,顺序是从前往后。n>0 从头到尾删除值为value的元素, n<0,从尾到头删除值为value的元素, n=0,移除所有值为value的元素


  • ltrim list n m:对一个列表进行修剪,只保留区间[n,m]内的元素。其他全部删除。


  • rpoplpush list1 list2:移除列表list1的最后一个元素,并将该元素添加到list2的前边。这个操作是原子性的。从6.2.0起被废除了。


  • lset list n value:将list中第n个元素的值设置为value


  • linsert list before|after value value1:将value1插入到value的前边或者后边。


性能总结
  • 它是一个字符串列表,left,right都可以插入添加
  • 如果键不存在,创建新的链表。
  • 如果已经存在,新增内容
  • 如果值全部移除,对应的键也就消失了
  • 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就比较低。
应用
  • 最新消息排行功能
  • 消息对列

9. 集合Set(单值多value)

  • redis的集合set是string类型的无序集合,是通过HashTable实现的。
常用命令说明
  • sadd key member[...]:将一个或者多个成员元素加入到集合中。
  • smembers key:返回存储在key中的所有成员
  • sismember key member:判断元素member是否是集合key中的成员。返回1表示是,0表示不是。


  • scrad key:返回集合中元素的数量。


  • srem key value:移除集合key中的一个或者多个元素value


  • srandmember key [count]:返回集合key中的随机元素,count表示返回几个元素。


  • spop key [count]:从集合key中删除一个或者多个元素,并返回删除的元素。(删除是随机的)


  • smove key1 key2 member:将指定的元素从集合key1移动到key2 。这是一个原子操作。


  • sdiff key [key...]:返回第一个集合key与其他key之间的差异,即第一个集合key独有的元素。
  • sinter key [key...]:返回所有给定集合key的成员交集
  • sunion key [key...]:返回所有给定集合key的并集

应用
  • 实现共同关注,共同好友等功能。

10. 哈希Hash(单值多value,v是一个键值对)

  • Hash是一个键值对集合,类似于java中的map,是一个String类型的field和value的映射表,特别适合存储对象。
常用命令
  • hset key field value [field value ....]: 为哈希表key的field字段赋值
  • hget key field:返回哈希表key中的field字段的值
  • hgetall key:返回哈希表key中所有的域和值
  • hdel key field [field...]:删除哈希表key中的一个或者多个指定字段。


  • hlen key:获取哈希表key中的字段fields的数量


  • hexists key field:查看哈希表的指定字段field是否存在。0表示不存在,1表示存在
  • hkeys key:返回哈希表key中所有的域field
  • hvals key:返回哈希表中所有域的值


  • hincrby key field increment: 为哈希表key中的域field的加上增量increment.增量为负数表示进行减法操作。


  • hsetnx key field value:为哈希表中不存在的字段field赋值为value。0表示设置失败,1表示设置成功。

应用
  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 存储部分变更的数据,如用户信息等。

11. 有序集合Zset

  • 在set基础上,加上一个score。之前set是sadd set1 v1 v2 v3…,现在Zset是zadd zset1 score1 v1 score2 v2。
常用命令
  • zadd key score1 member1[score2 member2...]:将一个或者多个member元素及其score值加入到有序集合key中。其中score可以是整数值或者双精度浮点数。可以为正或者负数
  • zrange key n m:返回有序集合key中的[n,m]区间内的元素。下标从0开始。如果m超出范围也不会报错,只会返回包含的。


  • zrangebyscore key n m:返回有序集合key中的成员,按照score的从小到大排序,范围是[n,m],n,m可以为-inf,+inf,这样在不知道有序集合数量的时候获取所有的成员注意[n,m]这个范围是score的范围,不是成员的下标


  • zrem key member1[member2...]:从有序集合key中删除指定的成员member


  • zcard key:返回有序集合key中的成员个数


  • zcount key n m:返回有序集key中,score在[n,m]之间的成员数量。


  • zrank key member:返回有序集key中成员的排名,按照score从低到高排名,从0开始


  • zrevrank key member:返回有序集key中成员的排名,按照score从高到低排名,从0开始

应用
  • 排行榜应用,取top n操作。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值