redis
需要c环境
yum install gcc-c++
# wget http://download.redis.io/releases/redis-6.0.8.tar.gz
# tar xzf redis-6.0.8.tar.gz
# cd redis-6.0.8
# make
执行完 make 命令后,redis-6.0.8 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli:
下面启动 redis 服务:
# cd src
# ./redis-server
注意这种方式启动 redis 使用的是默认配置。也可以通过启动参数告诉 redis 使用指定配置文件使用下面命令启动。
# cd src
# ./redis-server ../redis.conf
redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动 redis 服务进程后,就可以使用测试客户端程序 redis-cli 和 redis 服务交互了。 比如:
# cd src
# ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
一、另一种方式安装
1.1 编译
接上面一步安装后再执行 make install
redis默认安装路径:会在/usr/local/bin下
在bin下创建一个conf目录
[root@server-200 bin]# cp /opt/soft/redis-6.0.8/redis.conf /usr/local/bin/conf/
这个文件作为启动用
1.2 后台启动
vim /usr/local/bin/redis.conf
把daemonize no 改为yes
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-16AmiJwR-1620627538667)(image/image-20210505174912743.png)]
1.3 通过指定配置文件启动
[root@server-200 bin]# redis-server /usr/local/bin/conf/redis.conf
[root@server-200 bin]# ps -axu|grep redis
root 50827 0.2 0.2 162208 7856 ? Ssl 17:51 0:00 redis-server 127.0.0.1:6379
root 51193 0.0 0.0 112668 952 pts/2 S+ 17:51 0:00 grep --color=auto redis
1.4 连接redis
[root@server-200 yum.repos.d]# redis-cli -a 123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set a 123
OK
127.0.0.1:6379> get a
"123"
127.0.0.1:6379> shutdown #关闭redis也就是杀手redis进程
not connected> exit
[root@server-200 yum.repos.d]# ps -aux|grep redis
root 58215 0.0 0.0 112668 956 pts/0 R+ 17:54 0:00 grep --color=auto redis
[root@server-200 yum.repos.d]#
1.5 测试性能工具
redis-benchmark 是一个redis自带的压力测试工具
redis-benchmark 命令参数
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
简单测试:
测试:100个并发连接 100000请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lytsffS0-1620627538670)(image/image-20210505175731442.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TQpHQ8dd-1620627538673)(image/image-20210505180403162.png)]
1.6 基础的知识
默认有16个数据库
默认使用的是第0个
可以使用select进行切换数据库
127.0.0.1:6379> select 3 #切换数据库
OK
127.0.0.1:6379[3]> dbsize #查看db大小 为0
(integer) 0
127.0.0.1:6379[3]>
127.0.0.1:6379[3]> set a 12
OK
127.0.0.1:6379[3]> dbsize
(integer) 1
127.0.0.1:6379[3]>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Kwv5QZE-1620627538677)(image/image-20210505180651719.png)]
1.7 查看所有的key
127.0.0.1:6379[3]> keys *
1) "a"
127.0.0.1:6379[3]>
1.8 清除当前数据库
flushdb
---------
127.0.0.1:6379[3]> keys *
1) "a"
127.0.0.1:6379[3]> flushdb #清空当前数据库
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]>
1.9清空所有数据库
flushall
---------------
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> set a 3
OK
127.0.0.1:6379[3]> keys *
1) "a"
127.0.0.1:6379[3]> flushall #清空所有数据库
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>
2.0 redis是单线程
明白reids是很快的 官方表示,redis是基于内存操作,cpu不是redis性能瓶颈,redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了
二、五大数据类型
1.1 redis-key
exists name #判断name这个键是否存在 存在返回1
move name 1 # 移除key 1代表1号数据库
expire name 10 #设置10秒过期
ttl name #查看过期时间
127.0.0.1:6379> set name 1
OK
127.0.0.1:6379> get name
"1"
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> ttl name
(integer) 7
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379>
#查看数据类型:type
127.0.0.1:6379> set a 11
OK
127.0.0.1:6379> set name wang
OK
127.0.0.1:6379> type a
string
127.0.0.1:6379> type name
string
127.0.0.1:6379> set b '123'
OK
127.0.0.1:6379> type b
string
127.0.0.1:6379>
1.2 string(字符串)
# 追加key的值:append
127.0.0.1:6379> set yes hello
OK
127.0.0.1:6379> get yes
"hello"
127.0.0.1:6379> APPEND yes "word"
(integer) 9
127.0.0.1:6379> get yes
"hello"
127.0.0.1:6379>
#查看key的长度:strlen
127.0.0.1:6379> STRLEN yes
(integer) 9
#i++
#步长 i+=
# incr:加1 decr:减1 incrby:自定义加多少
127.0.0.1:6379> set a 0
OK
127.0.0.1:6379> get a
"0"
127.0.0.1:6379> incr a
(integer) 1
127.0.0.1:6379> incr a
(integer) 2
127.0.0.1:6379> incr a
(integer) 3
127.0.0.1:6379> get a
"3"
127.0.0.1:6379> decr a
(integer) 2
127.0.0.1:6379> decr a
(integer) 1
127.0.0.1:6379> decr a
(integer) 0
127.0.0.1:6379> get a
"0"
127.0.0.1:6379> INCRBY a 10
(integer) 10
127.0.0.1:6379> get a
"10"
127.0.0.1:6379>
1.2.1字符串范围
getrange
------------
127.0.0.1:6379> set a "hello worlld"
OK
127.0.0.1:6379> get a
"hello worlld"
127.0.0.1:6379> GETRANGE a 0 3 #截取字符串【0,3】
"hell"
127.0.0.1:6379> GETRANGE a 0 -1 #获取所有字符串
"hello worlld"
127.0.0.1:6379>
1.2.2 字符串替换
setrange
---------------
127.0.0.1:6379> get a
"hello worlld"
127.0.0.1:6379> SETRANGE a 1 xx #从1开始替换
(integer) 12
127.0.0.1:6379> get a
"hxxlo worlld"
127.0.0.1:6379>
1.2.3 setnx
如果key已经存在 再设置就不会成功
如果不存在 就设置成功
127.0.0.1:6379> get a
"hxxlo worlld"
127.0.0.1:6379> setnx a 123
(integer) 0
127.0.0.1:6379> get a
"hxxlo worlld"
127.0.0.1:6379>
1.2.4 setex
设置过期时间
setex (set with expire)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MrwMNItX-1620627538678)(image/image-20210505185133000.png)]
1.2.5 批量设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zljd5yjD-1620627538681)(image/image-20210505185347009.png)]
1.2.6 对象 json
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qxCkqDn0-1620627538682)(image/image-20210505185622389.png)]
1.2.7 getset
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMHddsQK-1620627538683)(image/image-20210505185738894.png)]
1.3 List
在redis里面,可以把list玩成,栈,队列,阻塞队列
所有的list命令都是用l开头的
127.0.0.1:6379> LPUSH list one
(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> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1 #获取区间的值
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list right #将一个值或多个值插入到列表的尾部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379>
1.3.1 LPOP
移除列表左边的值
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list #移除列表的第一个元素
"three"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
3) "right"
127.0.0.1:6379> rpop list #移除列表的最后一个元素
"right"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379>
1.3.2 rpop
移除列表右边的值
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list #移除列表的第一个元素
"three"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
3) "right"
127.0.0.1:6379> rpop list #移除列表的最后一个元素
"right"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379>
1.3.3 Lindex
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wT4micdz-1620627538685)(image/image-20210505191046826.png)]
1.3.4 Llen
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDvii9c2-1620627538685)(image/image-20210505191147001.png)]
1.3.5 Lrem
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hOAZqXLC-1620627538687)(image/image-20210505191328442.png)]
1.3.6 Ltrim
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6zG4yhd-1620627538688)(image/image-20210505191534307.png)]
1.3.7 rpoplpush
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CEMEZqjR-1620627538688)(image/image-20210505191752269.png)]
1.3.8 Lset
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8bBbPW3M-1620627538690)(image/image-20210505192020783.png)]
1.3.9 Linsert
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YAL2ffyD-1620627538690)(image/image-20210505192224567.png)]
1.3.10 小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqb11H4S-1620627538690)(image/image-20210505192546277.png)]
三、事务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uCSy73mn-1620627538692)(image/image-20210506000415691.png)]
1.1 开启事务
1.开启事务(multi)
2.命令入队()
3.执行事务(exec)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> set k3 3
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> set k4 4
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
4) "1"
5) OK
127.0.0.1:6379>
1.2 放弃事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> set k3 3
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> set k4 4
QUEUED
127.0.0.1:6379> DISCARD #放弃事务
OK
127.0.0.1:6379> get k4
(nil)
四、jedis
1.1 Java操作redis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2B04IJrP-1620627538692)(image/image-20210506003632428.png)]
导入jedis依赖
maven网站:
https://mvnrepository.com/artifact/redis.clients/jedis
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>redis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 导入jredis的包-->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
<!-- fastjson 阿里巴巴的-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
</project>
java部分
package test.jedis.com;
import redis.clients.jedis.Jedis;
public class TestPing {
public static void main(String[] args) {
// new Jedis 对象即可
Jedis jedis=new Jedis("192.168.1.200",6379);
System.out.println(jedis.ping());
}
}
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
```
java部分
package test.jedis.com;
import redis.clients.jedis.Jedis;
public class TestPing {
public static void main(String[] args) {
// new Jedis 对象即可
Jedis jedis=new Jedis("192.168.1.200",6379);
System.out.println(jedis.ping());
}
}