Redis入门
redis 是什么
Redis(Remote Dictionary Server ),即远程字典服务
是一个开源的使用ANSI
-
内存存储。持久化、内存中断电即失、所以持久化很重要(rdb/aof)
-
效率高,可用于高速缓存
-
发布订阅系统
-
地图信息分析等等
持久化、集群 、事务、
官网:https://redis.io/ 中文网:http://www.redis.cn/
通过官网下载即可。
Linux安装
Windows安装下载解压双击即可。下载地址:GitHub
#下载安装包,上传到opt目录下、并解压
[root@localhost jdk1.8.0_261]# wget http://download.redis.io/releases/redis-6.0.8.tar.gz
[root@localhost home]# mv redis-6.0.8.tar.gz /opt/
[root@localhost opt]# tar zxvf redis-6.0.8.tar.gz
[root@localhost opt]# ls
redis-6.0.8 redis-6.0.8.tar.gz
#进入解压的文件,可以看到redis的配置文件redis.conf
#安装基本环境gcc-c++
[root@localhost redis-6.0.8]# yum -y install gcc-c++
[root@localhost redis-6.0.8]#make
INSTALL redis-check-rdb
INSTALL redis-check-aof
Hint: It's a good idea to run 'make test' ;)
make[1]: Leaving directory `/opt/redis-6.0.8/src' 代表make成功
[root@localhost redis-6.0.8]#make install
Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: Leaving directory `/opt/redis-6.0.8/src' 代表install成功
#注意报错!make[1]: *** [server.o] Error 1
#原因是因为gcc版本过低,yum安装的gcc是4.8.5的。因此需要升级gcc,升级过程如下:
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
#修改环境变量
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
gcc -v
make 和make install以后即可。
#注意安装完成以后redis-server在/usr/local/bin/目录下。
[root@localhost bin]# pwd
/usr/local/bin
[root@localhost bin]# ls
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
#拷贝/opt/redis-6.0.8/redis.conf文件到/usr/local/bin目录下
[root@localhost bin]# cp /opt/redis-6.0.8/redis.conf .
[root@localhost bin]# ls
redis-benchmark redis-check-rdb redis.conf redis-server
redis-check-aof redis-cli redis-sentinel
#redis默认是前台启动的,修改配置文件
vim redis.conf
daemonize no 改为 daemonize yes 后台方式启动
#启动redis服务、指定启动配置文件为redis.conf
[root@localhost bin]# redis-server redis.conf
[root@localhost bin]# ./redis-server ./redis.conf
#客户端redis-cli连接测试:
[root@localhost bin]# redis-cli -h localhost -p 6379 //默认本地可以不加-h
localhost:6379> ping
PONG
localhost:6379> set name koeb
OK
localhost:6379> get name
"koeb"
localhost:6379> keys * #查看所有的key
1) "name"
#查看redis进程是否开启
[root@localhost redis-6.0.8]# ps -ef | grep redis
root 7680 1 0 02:11 ? 00:00:00 redis-server 127.0.0.1:6379
root 7688 2637 0 02:13 pts/0 00:00:00 redis-cli -h localhost -p 6379
root 7713 7244 0 02:16 pts/1 00:00:00 grep --color=auto redis
#关闭redis服务、并查看进程
localhost:6379> shutdown
not connected> exit
[root@localhost redis-6.0.8]# ps -ef | grep redis
root 7716 7244 0 02:17 pts/1 00:00:00 grep --color=auto redis
会使用单机多redis启用
测试性能
redis-benchmark是一个压力测试时工具!
Redis 自带了一个叫 redis-benchmark
的工具来模拟 N 个客户端同时发出 M 个请求。 (类似于 Apache ab 程序)。可以使用 redis-benchmark -h 来查看基准参数。
测试:
#100个并发连接 10w个请求
-h 指定主机ip
-p 指定端口
-c 指定连接数
-n 指定并发数
[root@localhost bin]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000
基础知识
redis默认有16个数据库
默认使用的是第0 个、可以使用select进行切换数据库!
127.0.0.1:6379> SELECT 3 #切换数据库
OK
127.0.0.1:6379[3]> DBSIZE #查看Db大小
(integer) 0
#
127.0.0.1:6379[3]> set A qiang
OK
127.0.0.1:6379[3]> DBSIZE
(integer) 1
127.0.0.1:6379[3]> SELECT 7
OK
127.0.0.1:6379[7]> DBSIZE
(integer) 0
127.0.0.1:6379[7]> get A
(nil)
127.0.0.1:6379[7]> SELECT 3
OK
127.0.0.1:6379[3]> get A
"qiang"
#清空当前数据库:FLUSHDB 清空所有库:FLUSHALL
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)
redis 是单线程的!
redis是很快的,redis是基于内存操作,CPU不是redis性能瓶颈,redis的瓶颈是机的内存及网络带宽。
redis为什么单线程这么快?C语言写的
-
误区:高性能的服务器一定是多线程的、
-
误区:多线程(cpu上下文切换)一定比单线程效率高、CPU>内存>硬盘
核心:redis是将所有的数据全部放在内存中的,所以使用单线程去操作效率就是最高的、多线程(CPU上下文:耗时)。对于内存系统来说、单线程就是最佳的。
5大基本数据类型
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ。 它支持多种类型的数据结构,如
Redis-key
127.0.0.1:6379> keys * #查看所有key
(empty array)
127.0.0.1:6379> set name kobe #设置 key
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> EXISTS name #判断当前key是否存在
(integer) 1
127.0.0.1:6379> EXISTS name2
(integer) 0
127.0.0.1:6379> move name 1 #移除当前key
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name kobe
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> get name
"kobe"
127.0.0.1:6379> EXPIRE name 10 #设置key的过期时间 默认秒
(integer) 1
127.0.0.1:6379> ttl name #查看当前key的剩余时间
(integer) 3
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> set name kobe
OK
127.0.0.1:6379> type name #查看当前key的类型
string
127.0.0.1:6379> type age
string
官网命令文档:http://www.redis.cn/commands.html
String(字符串)
------------------------------------------------------------
127.0.0.1:6379> set key1 v1 #设置key
OK
127.0.0.1:6379> get key1 #获得key
"v1"
127.0.0.1:6379> keys * #查看所有key
1) "key1"
127.0.0.1:6379> EXISTS key1 #判断key是否存在
(integer) 1
127.0.0.1:6379> APPEND key1 "hello" #追加字符串,如果key不存在,就增加=set
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 #获取字符串长度
(integer) 7
127.0.0.1:6379> APPEND key1 "koebe"
(integer) 12
127.0.0.1:6379> get key1
"v1hellokoebe"
127.0.0.1:6379>
------------------------------------------------------------------
127.0.0.1:6379> set views 0 #初始浏览量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> DECR views #自减1
(integer) 1
127.0.0.1:6379> DECR views
(integer) 0
127.0.0.1:6379> DECR views
(integer) -1
127.0.0.1:6379> DECR views
(integer) -2
127.0.0.1:6379> get views
"-2"
127.0.0.1:6379> INCRBY views 10 #设置步长、指定增量
(integer) 8
127.0.0.1:6379> INCRBY views 10
(integer) 18
127.0.0.1:6379> DECRBY views 5 #设置步长、指定减量
(integer) 13
127.0.0.1:6379> DECRBY views 5
(integer) 8
----------------------------------------------------------------
#截取
127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> APPEND key1 ",lixingqiang"
(integer) 17
127.0.0.1:6379> get key1
"hello,lixingqiang"
127.0.0.1:6379> GETRANGE key1 0 4 #截取字符串 【0,4】
"hello"
127.0.0.1:6379> GETRANGE key1 0 -1 #截取字符串 【0,-1】 等于 get key1
"hello,lixingqiang"
---------------------------------------------------------------------------
#替换
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 XX #替换指定位置开始的字符串:
(integer) 7
127.0.0.1:6379> get key2
"aXXdefg"
-----------------------------------------------------------------------------
#setex (set with expire) #设置过期时间
#setnx (set if not expire) #不存在再设置
127.0.0.1:6379> setex key3 30 "hello" #设置一个key3的值为hello 30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 24
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis" #如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
2) "mykey"
3) "key2"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "MongoDB" #如果mykey存在,创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
-----------------------------------------------------------------------
mset
mget
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #同事设置多个值
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3