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中存储的值+10decrby 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中所有的域fieldhvals 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操作。