目录
一、缓存服务器简介
许多Web应用都将数据保存到RDBMS关系数据库管理系统中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据查询结果,减少数据库访问次数,以提高动态web等应用的速度、提高可扩展性。为弥补关系型数据库的不足,各种各样的NoSQL数据库应运而生。
1、NoSQL
产品: redis,mongodb,memcached
名词解释:非关系型数据库
以键值对的方式存储数据---(Key-Value)的形式
2、NoSQL的优点/缺点
优点:
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
缺点:
- 没有标准化
- 有限的查询功能(到目前为止)
- 最终一致是不直观的程序
缓存服务器作用: 加快访问速度 ,缓解数据库压力
注意:
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等
3、关系型数据库
产品:SQL Server Oracle mysql
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
二、Redis简介
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存,也可持久化的Key-Value数据库。
redis官网:https://redis.io 注:域名io属于国家域名,是british Indian Ocean territory,即英属印度洋领地
1、redis软件获取和帮助
• 官方网站:https://redis.io
• 官方各版本下载地址:http://download.redis.io/releases/
• Redis 中文命令参考:http://redisdoc.com
• 中文网站1:http://redis.cn
• 中文网站2:http://www.redis.net.cn
2、redis的特点
1、丰富的数据结构 list,set,hash等数据结构的存储
2、支持持久化
3、支持事务 “一个完整的动作,要么全部执行,要么什么也没有做”。
4、支持主从、支持高可用,支持分布式分片集群
三、Redis部署
1、编译安装
下载源码包:
[root@localhost ~]# wget http://download.redis.io/releases/redis-6.0.7.tar.gz
解压到指定目录
[root@localhost ~]# tar xf redis-6.0.7.tar.gz -C /usr/local/
[root@localhost ~]# mv /usr/local/redis-6.0.7 /usr/local/redis
切换到指定目录下进行编译安装
[root@localhost ~]# cd /usr/local/redis
[root@localhost redis]# make MALLOC=lib
虚拟机如果报错:缺少两个文件或目录
cc: error: ../deps/hiredis/libhiredis.a: No such file or directory
cc: error: ../deps/lua/src/liblua.a: No such file or directory
解决方案:
[root@localhost redis]# cd deps/ (没报错的话这一步忽略)
[root@localhost deps]# make lua hiredis linenoise
...
然后再继续make
[root@localhost deps]# cd /usr/local/redis-6.0.7/src && make test
redis6版本的在执行make all 的时候会报错,如果出现下面的错误
make: *** [server.o] Error 1
解决方案:更新gcc版本
[root@localhost src]# yum -y install centos-release-scl
[root@localhost src]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@localhost src]# scl enable devtoolset-9 bash
[root@localhost src]# echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
[root@localhost src]# gcc -v
[root@localhost src]# make test
如果还是报错出现下面的错误:
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1
解决方案:
[root@localhost src]# yum -y install tcl
做完之后直接make all,不用再make test
[root@localhost src]# make all
Hint: It's a good idea to run 'make test' ;) #看到这就安装完成了
启动redis
[root@localhost src]# pwd
/usr/local/redis/src
[root@localhost src]# ./redis-server
看到这个就启动成功了。
但是可以看到,编译安装的redis启动之后是在前台运行的,我们想要使用redis需要另开一个终端,使用的是redis-cli客户端命令,或者启动的时候./redis-server & 让其后台运行。
[root@localhost src]# ./redis-server &
[root@localhost src]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
说明redis可以正常使用
但是这时候想要关闭redis只能通过kill杀死进程关闭,所以我们可以通过一些操作,设置系统进程启动关闭redis
[root@localhost ~]# vim /usr/local/redis/redis.conf
#bind 127.0.0.1 # 将bind 127.0.0.1注释掉,否则数据库只有本机能够使用 或者 修改为 0.0.0.0
daemonize yes # 将no改为yes,使数据库能够以后台守护进程运行
protected-mode no # 把保护模式的yes改为no,否则会阻止远程访问
requirepass redis # 打开注释,设置密码
[root@localhost ~]# mkdir /etc/redis
[root@localhost ~]# cp /usr/local/redis/redis.conf /etc/redis
开机自启动,将redis的启动脚本复制一份放到/etc/init.d目录下,并改名为redis
[root@localhost ~]# cp /usr/local/redis/utils/redis_init_script /etc/init.d/redis
[root@localhost ~]# vim /etc/init.d/redis
EXEC=/usr/local/redis/src/redis-server
CLIEXEC=/usr/local/redissrc/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis.conf"
[root@localhost ~]# systemctl daemon-reload #启用守护进程
[root@localhost ~]# systemctl start redis #用系统命令启动redis
[root@localhost ~]# ps aux | grep redis
root 1192 0.0 0.0 144316 2000 ? Ssl 16:00 0:00 /usr/local/redis-6.0.7/src/redis-server 0.0.0.0:6379
root 1197 0.0 0.0 9096 676 pts/1 S+ 16:00 0:00 grep --color=auto redis
2、yum安装redis
安装redis的仓库,安装7.0版本的,可以去官方网站获取链接地址
[root@localhost ~]# yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm -y
指定源安装redis:
[root@localhost ~]# yum --enablerepo=remi install redis -y
启动redis并做开机启动:
[root@localhost ~]# systemctl start redis
[root@localhost ~]# systemctl enable redis
设置redis.conf,允许远程登录
[root@localhost ~]# vim /etc/redis.conf
bind 127.0.0.1 改为 bind 0.0.0.0 (可选)
登陆redis
[root@localhost ~]# systemctl restart redis
[root@localhost ~]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name zcg
OK
127.0.0.1:6379> get name
"zcg"
127.0.0.1:6379>
我们以下的实验等内容都是使用的yum安装的redis
四、Redis使用
1、redis相关工具
./redis-benchmark #用于进行redis性能检测的工具
./redis-check-rdb #用于修复出问题的dump.rdb文件
./redis-cli #redis的客户端
./redis-server #redis的服务端
./redis-check-aof #用于修复出问题的AOF文件
./redis-sentinel #用于集群管理
2、redis配置文件
/etc/redis/redis.conf
1、daemonize no/yes #是否后台运行
2、port 6379 #默认端口
3、appendonly no/yes #AOF日志开关是否打开,默认是关闭的
4、logfile /var/log/redis.log #日志文件位置
5、代表filename dump.rdb #RDB持久化数据文件
6、bind 10.0.0.51 ip2 ip3 ip4 #指定IP进行监听
7、protected-mode yes/no #保护模式,是否只允许本地访问,默认开启
8、增加requirepass {password} #设置客户端登录密码
开启登录密码后使用客户端工具需要使用密码,比如:redis-cli -a redis
3、数据持久化
开启持久化功能后,重启redis后,数据会自动通过持久化文件恢复!
redis持久化的两种方式:
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File仅追加文件)
1、RDB方式
RDB(Redis DataBase):是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
特点:
1、周期性
2、不影响数据写入。(RDB会启动子进程,备份所有数据。当前进程继续提供数据的读写。当备份完成,才替换老的备份文件)
3、高效 (一次性还原所有数据、)
4、完整性较差(故障点到上一次备份之间的数据无法恢复)
2、AOF文件方式
AOF(Append Only File)则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
特点:
1、实时性
2、完整性较好
3、体积大 #记录数据的指令,删除数据的指令都会被记录下来。
RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。
如何选择方式?
缓存:不用开启任何持久方式
双开:因RDB数据不实时,但同时使用两者时服务器只会找AOF文件,所以RDB留作万一的手段。
redis持久化 – 如何选择RDB和AOF
对于我们应该选择RDB还是AOF,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案。
写入速度快 ------------AOF
写入速度慢 ------------RDB
4、持久化配置
1、RDB默认开启
192.168.242.144
[root@localhost ~]# cd /etc/redis/
[root@localhost redis]# vim redis.conf
#dbfilename:持久化数据存储在本地的文件
dbfilename dump.rdb #RDB的文件名
#dir:持久化数据存储在本地的路径
dir /data/application/redis/data
##snapshot(快照)触发的时机,save <seconds> <changes>
##如下为900秒后,至少有一个变更操作,才会snapshot
##对于此值的设置,需要谨慎,评估系统的变更操作密集程度
##可以通过save ""来关闭snapshot功能
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000
##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等
stop-writes-on-bgsave-error yes
##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间
rdbcompression yes
做个小实验,我们把RDB快照功能关闭,然后将dump.rdb文件删除,验证重启redis服务后是否还能找到数据
关闭RDB快照功能之前
[root@localhost redis]# redis-cli
127.0.0.1:6379> set name zzzzzz
OK
127.0.0.1:6379> get name
"zzzzzz"
127.0.0.1:6379> exit
[root@localhost redis]# systemctl restart redis
[root@localhost redis]# redis-cli
127.0.0.1:6379> get name
"zzzzzz"
可以看到就算重启服务,数据也不会丢失,然后我们关闭快照功能
[root@localhost ~]# cd /etc/redis/
[root@localhost redis]# vim redis.conf
save "" 将这个功能的注释取消
[root@localhost redis]# rm -rf /var/lib/redis/dump.rdb
[root@localhost redis]# systemctl restart redis
[root@localhost redis]# redis-cli
127.0.0.1:6379> get name
"zzzzzz"
127.0.0.1:6379> exit
[root@localhost redis]# rm -rf /var/lib/redis/dump.rdb
[root@localhost redis]# ls /var/lib/redis/ #有时候需要多删几次才能删除
[root@localhost redis]# systemctl restart redis
[root@localhost redis]# redis-cli
127.0.0.1:6379> get name
(nil) #刚才的数据没了
127.0.0.1:6379> set name 1111
OK
127.0.0.1:6379> get name
"1111"
127.0.0.1:6379> exit
[root@localhost redis]# systemctl restart redis
[root@localhost redis]# redis-cli
127.0.0.1:6379> get name #发现关闭快照功能后,数据在重启服务后丢失
(nil)
2、客户端使用命令进行持久化save存储
方式一
redis-cli -h 192.168.242.149 -p 6379 save #前台进行存储
OK
方式二
redis-cli -h ip -p port bgsave #后台进行存储
注意:每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
再准备一台虚拟机安装redis,允许远程登录redis,关闭save快照功能,保证redis没有任何数据,重启redis,然后创建一个key,用之前的redis服务器远程登录这台新的Redis服务器使用命令进行持久化save存储
新的redis:192.168.242.149
[root@localhost redis]# vim redis.conf
save ""
[root@localhost redis]# ls /var/lib/redis/
[root@localhost redis]# systemctl restart redis
[root@localhost redis]# redis-cli
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name zzzzz
OK
127.0.0.1:6379> exit
然后用之前的redis服务器远程登录这台redis服务器使用命令进行持久化save存储
192.168.242.144:
[root@localhost redis]# redis-cli -h 192.168.242.149 -p 6379 save
OK
然后去新的redis服务器上查看是否生成dump.rdb文件
[root@localhost redis]# ls /var/lib/redis/
dump.rdb
[root@localhost redis]# systemctl restart redis
[root@localhost redis]# redis-cli
127.0.0.1:6379> get name
"zzzzz"
3、AOF 持久化配置
appendonly yes/no 是否打开aof日志功能
appendfsync always 每1个命令,都立即同步到aof
appendfsync everysec 每秒写1次
appendfsync no 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.
高级参数:
no-appendfsync-on-rewrite yes/no 正在导出rdb快照的过程中,要不要停止同步 aof
auto-aof-rewrite-percentage 100 aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次。
auto-aof-rewrite-min-size 64mb aof文件,至少超过64M时,重写
4、RDB 到 AOF 切换
1、为最新的 dump.rdb 文件创建一个备份。
2、将备份放到一个安全的地方。
3、执行以下两条命令:
redis-cli config set appendonly yes
redis-cli config set save “”
4、确保写命令会被正确地追加到 AOF 文件的末尾。
注意:
执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。
执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能。
别忘了在 redis.conf 中打开 AOF 功能! 否则的话, 服务器重启之后, 之前通过 CONFIG SET 设置的配置不会生效, 程序会按原来的配置来启动服务器。
5、数据恢复
(这个实验跟上边的没关系)
将新机器的redis停止,然后将旧redis上的数据拷贝到新机器定义的rdb文件目录下,并覆盖原有的数据
新redis:192.168.242.149:
systemctl stop redis
旧redis:192.168.242.144
[root@localhos ~]# redis-cli
127.0.0.1:6379> set name 123
ok
127.0.0.1:6379> exit
[root@localhos ~]# scp /var/lib/redis/dump.rdb root@192.168.242.149:/var/lib/redis/
新redis:192.168.242.149:
systemctl start redis
redis-cli
127.0.0.1:6379> get name
"123"
五、Redis管理实战
1、Redis 基本数据类型
类型 | 说明 |
String 字符串 | Redis 字符串数据类型的相关命令用于管理 redis 字符串值 |
Hash 哈希 | Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 (2的32次方)2^32 - 1 键值对(40多亿)。 |
List 列表 | Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。 |
Set 集合 | Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 |
Sorted set 有序集合 | Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 |
2、 Redis 命令介绍
运行redis-cli连接服务器。执行help
127.0.0.1:6379> help
redis-cli 6.0.7
To get help about Redis commands type:
"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
To set redis-cli preferences:
":set hints" enable online hints
":set nohints" disable online hints
Set your preferences in ~/.redisclirc
根据输出可以看到 help 命令有三种用法
“help @<group>” to get a list of commands in <group>,
”help <command>” for help on <command>,
”help <tab>” to get a list of possible help topics
help @ 查看命令组的帮助
help @generic 查看通用组的命令包括del,dump…等等通用命令。
help @string 查看字符串组命令。还可以查看其他组的命令如help @list, help @set, help @sorted_set,help @hash 等等。
查看所有的分组可以通过help <tab>提示。
127.0.0.1:6379> help @generic
DEL key [key ...]
summary: Delete a key
since: 1.0.0
DUMP key
summary: Return a serialized version of the value stored at the specified key.
since: 2.6.0
EXISTS key [key ...]
summary: Determine if a key exists
since: 1.0.0
EXPIRE key seconds
summary: Set a key's time to live in seconds
since: 1.0.0
EXPIREAT key timestamp
summary: Set the expiration for a key as a UNIX timestamp
since: 1.2.0
KEYS pattern
summary: Find all keys matching the given pattern
since: 1.0.0
MIGRATE host port key| destination-db timeout [COPY] [REPLACE] [AUTH password] [KEYS key]
summary: Atomically transfer a key from a Redis instance to another one.
since: 2.6.0
MOVE key db
summary: Move a key to another database
since: 1.0.0
OBJECT subcommand [arguments [arguments ...]]
summary: Inspect the internals of Redis objects
since: 2.2.3
PERSIST key
summary: Remove the expiration from a key
since: 2.2.0
PEXPIRE key milliseconds
summary: Set a key's time to live in milliseconds
since: 2.6.0
PEXPIREAT key milliseconds-timestamp
summary: Set the expiration for a key as a UNIX timestamp specified in milliseconds
since: 2.6.0
PTTL key
summary: Get the time to live for a key in milliseconds
since: 2.6.0
RANDOMKEY -
summary: Return a random key from the keyspace
since: 1.0.0
RENAME key newkey
summary: Rename a key
since: 1.0.0
RENAMENX key newkey
summary: Rename a key, only if the new key does not exist
since: 1.0.0
RESTORE key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]
summary: Create a key using the provided serialized value, previously obtained using DUMP.
since: 2.6.0
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
summary: Incrementally iterate the keys space
since: 2.8.0
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
summary: Sort the elements in a list, set or sorted set
since: 1.0.0
TOUCH key [key ...]
summary: Alters the last access time of a key(s). Returns the number of existing keys specified.
since: 3.2.1
TTL key
summary: Get the time to live for a key
since: 1.0.0
TYPE key
summary: Determine the type stored at key
since: 1.0.0
UNLINK key [key ...]
summary: Delete a key asynchronously in another thread. Otherwise it is just as DEL, but non blocking.
since: 4.0.0
WAIT numreplicas timeout
summary: Wait for the synchronous replication of all the write commands sent in the context of the current connection
since: 3.0.0
GEORADIUSBYMEMBER_RO key arg arg arg ...options...
summary: Help not available
since: not known
SUBSTR key arg arg
summary: Help not available
since: not known
PFDEBUG arg arg ...options...
summary: Help not available
since: not known
BITFIELD_RO key ...options...
summary: Help not available
since: not known
HOST: ...options...
summary: Help not available
since: not known
XSETID key arg
summary: Help not available
since: not known
ASKING
summary: Help not available
since: not known
GEORADIUS_RO key arg arg arg arg ...options...
summary: Help not available
since: not known
REPLCONF ...options...
summary: Help not available
since: not known
PFSELFTEST
summary: Help not available
since: not known
RESTORE-ASKING key arg arg ...options...
summary: Help not available
since: not known
POST ...options...
summary: Help not available
since: not known
help help后面参数提示补全
help 之后按tab按键可提示参数。在命令行下 tab按键相信是用的最多的一个按键。
help 空格之后一直按tab,可按顺序查看到所有可能的组和命令。也可输入需要查询的@组或命令的前缀再按tab补全。
3、Redis 全局 Key 操作
命令介绍
命令 | 含义 |
KEYS * | 查看KEY支持通配符 |
DEL | 删除给定的一个或多个key |
EXISTS | 检查是否存在 |
RENAME | 变更KEY名 |
SORT | 键值排序,有非数字时报错 |
TYPE | 返回键所存储值的类型 |
DUMP RESTORE | 序例化与反序列化 |
EXPIRE\ PEXPIRE | 以秒\毫秒设定生存时间 |
TTL\ PTTL | 以秒\毫秒为单位返回生存时间 |
PERSIST | 取消生存时间设置 |
RANDOMKEY | 返回数据库中的任意键 |
常用 keys 命令
1、del 命令
del 命令用来 删除指定的一个或多个 key
删除一个 key
127.0.0.1:6379> set test 1234
127.0.0.1:6379> del test
删除多个 key
127.0.0.1:6379> mset test1 1111 test2 2222
127.0.0.1:6379> del test1 test2
2、exists 命令
exists 命令用来查询 key 是否存在
127.0.0.1:6379> mset test1 1111 test2 2222
192.168.152.133:6379> EXISTS test1
(integer) 1
3、expire 命令
expire 命令用来 设置 key 的过期秒数
127.0.0.1:6379> get test1
与 expire 命令相关的命令有三个,分别是:
expireat 命令用来 设置一个 UNIX 时间戳的过期时间, (从1970年1月1日0时0分0秒到你设置过期的秒数)
127.0.0.1:6379> EXPIREAT test2 1592965943
(integer) 1
pexpire 命令用来 设置 key 的有效时间以毫秒为单位
127.0.0.1:6379> EXPIRE test3 100
(integer) 1
127.0.0.1:6379> ttl test3
(integer) 94
127.0.0.1:6379> pttl test3
(integer) 89235
pexpireat 命令用来 设置 key 的到期 UNIX 时间戳以毫秒为单位
127.0.0.1:6379> PEXPIREAT test3 1592965943000
(integer) 1
192.168.152.133:6379> ttl test3
(integer) 365
4、keys 命令
keys 命令用来 查找所有匹配给定的模式的键
127.0.0.1:6379> keys *
1) "a"
2) "test"
3) "test1"
4) "name"
在 Redis 中是支持模糊查询的,它有 3 个通配符,分别是:*、 ? 和 []
*:通配任意多个字符
?:通配单个字符
[]:通配括号内的某 1 个字符
上面介绍了关于 * 的用法,下面来简单的看一下 ? 和 [] 的用法
[] 的用法如下:
127.0.0.1:6379> keys *[s]*
1) "test"
2) "test1"
127.0.0.1:6379> keys *[a]*
1) "a"
2) "name"
? 的用法如下:
127.0.0.1:6379> set a bbb
OK
127.0.0.1:6379> keys ?
1) "a"
ttl 命令
ttl 命令用来 获取 key 的有效时间(单位:秒)
127.0.0.1:6379> get test1
上面的命令是,我们用 expire 对一个 key 设置一个过期时间,然后使用 ttl 观察它的剩余时间
ttl 一个 key,如果返回 -1,则说明该 key 不会过期
ttl 一个 key,如果返回 -2,则说明没有指定的 key
与 ttl 相关的命令是 pttl 命令,它用来 获取 key 的有效毫秒数
rename 命令
rename 命令用来 将一个 key 重命名
127.0.0.1:6379> rename url url1234
4、Redis String(字符串)
string是redis最基本的类型,一个key对应一个value。一个键最大能存储 512MB。
命令 | 描述 |
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值。 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
GETSET key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
GETBIT key offset**对 key** | 所储存的字符串值,获取指定偏移量上的位(bit)。 |
MGET key1 [key2..] | 获取所有(一个或多个)给定 key 的值。 |
SETBIT key offset value | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
SETEX key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
SETNX key value | 只有在 key 不存在时设置 key 的值。 |
SETRANGE key offset value | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
STRLEN key | 返回 key 所储存的字符串值的长度。 |
MSET key value [key value ...] | 同时设置一个或多个 key-value 对。 |
MSETNX key value [key value ...] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
PSETEX key milliseconds value | 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
INCR key | 将 key 中储存的数字值增一。 |
INCRBY key increment | 将 key 所储存的值加上给定的增量值(increment) 。 |
INCRBYFLOAT key increment | 将 key 所储存的值加上给定的浮点增量值(increment) 。 |
DECR key | 将 key 中储存的数字值减一。 |
DECRBY key decrementkey | 所储存的值减去给定的减量值(decrement) 。 |
APPEND key value | 如果 key 已经存在并且是一个字符串, APPEND 命令将 指定value 追加到改 key 原来的值(value)的末尾。 |
String 操作介绍
1、SET
1、语法
SET key value [EX seconds] [PX milliseconds] [NX|XX]将字符串值 value 关联到 key 。
如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。
当 SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。
返回值SET, 命令只在设置操作成功完成时才返回 OK; 如果命令使用了 NX 或者 XX选项, 但是因为条件没达到而造成设置操作未执行, 那么命令将返回空批量回复(NULL Bulk Reply)。
代码示例
-
对不存在的键进行设置:
redis> SET key "value"
OK
redis> GET key
- "value"对已存在的键进行设置:
redis> SET key "new-value"
OK
redis> GET key
"new-value"
5、Redis Hash(字典)
HSET
我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器。
所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储995701749 个键值对。
命令 | 描述 |
HDEL key field1 [field2] | 删除一个或多个哈希表字段 |
HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在。 |
HGET key field | 获取存储在哈希表中指定字段的值。 |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
HINCRBY key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment 。 |
HINCRBYFLOAT key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |
HKEYS key | 获取所有哈希表中的字段 |
HLEN key | 获取哈希表中字段的数量 |
HMGET key field1 [field2] | 获取所有给定字段的值 |
HMSET key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中。 |
HSET key field value | 将哈希表 key 中的字段 field 的值设为 value 。 |
HSETNX key field value | 只有在字段 field 不存在时,设置哈希表字段的值。 |
HVALS key | 获取哈希表中所有值 |
HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对。 |
HSET语法
HSET hash field value
将哈希表 hash 中域 field 的值设置为 value 。
如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。
如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。
代码示例
设置一个新域:
redis> HSET website google "www.g.cn"
(integer) 1
redis> HGET website google
"www.g.cn"
对一个已存在的域进行更新:
redis> HSET website google "www.google.com"
(integer) 0
#虽然返回值为0,但是旧值依然被新值覆盖了
redis> HGET website google
"www.google.com"
HSETNX
语法:
HSETNX hash field value
当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。
如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。
如果哈希表 hash 不存在, 那么一个新的哈希表将被创建并执行 HSETNX 命令。
返回值
HSETNX 命令在设置成功时返回1,在给定域已经存在而放弃执行设置操作时返回0.
代码示例:
域尚未存在, 设置成功:
redis> HSETNX database key-value-store Redis
(integer) 1
redis> HGET database key-value-store
"Redis"
域已经存在, 设置未成功, 域原有的值未被改变:
redis> HSETNX database key-value-store Riak
(integer) 0
redis> HGET database key-value-store
"Redis"
HGET
语法:
HGET hash field
返回哈希表中给定域的值
返回值
HGET 命令在默认情况下返回给定域的值。
如果给定域不存在于哈希表中,又或者给定的哈希表并不存在,那么命令返回 nil 。
代码示例:
域存在的情况:
redis> HSET homepage redis redis.com
(integer) 1
redis> HGET homepage redis
"redis.com"
域不存在的情况:
redis> HGET site mysql
(nil)
6、Redis LIST(列表)
LIST 介绍
List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。
在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。
List中可以包含的最大元素数量是4294967295。
命令 | 描述 |
BLPOP key1 [key2 ] timeout | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
BRPOPLPUSH source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
LINDEX key index | 通过索引获取列表中的元素 |
LINSERT key BEFORE|AFTER pivot value | 在列表的元素前或者后插入元素 |
LLEN key | 获取列表长度 |
LPOP key | 移出并获取列表的第一个元素 |
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
LPUSHX key value | 将一个值插入到已存在的列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素 |
LREM key count value | 移除列表元素 |
LSET key index value | 通过索引设置列表元素的值 |
LTRIM key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
RPOP key | 移除并获取列表最后一个元素 |
RPOPLPUSH source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
RPUSH key value1 [value2] | 在列表中添加一个或多个值 |
RPUSHX key value | 为已存在的列表添加值 |
LIST 应用场景
消息队列系统,比如sina微博
在Redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。但是做了限制不能超过5000个ID,因此获取ID的函数会一直询问Redis。只有在start/count参数超出了这个范围的时候,才需要去访问数据库。
系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
LIST 操作介绍
LPUSH
语法
LPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表头
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
返回值:
执行 LPUSH 命令后,列表的长度。
代码示例:
# 加入单个元素
redis> LPUSH languages python
(integer) 1
# 加入重复元素
redis> LPUSH languages python
(integer) 2
redis> LRANGE languages 0 -1 # 列表允许重复元素
1) "python"
2) "python"
# 加入多个元素
redis> LPUSH mylist a b c
(integer) 3
redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LPUSH zzzzzz 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LRANGE zzzzzz 0-1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE zzzzzz 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> LRANGE zzzzzz 0 2
1) "5"
2) "4"
3) "3"
127.0.0.1:6379> LRANGE zzzzzz 2 3
1) "3"
2) "2"
7、Redis SET(集合)
SET 介绍
Set类型看作为没有排序的字符集合。Set可包含的最大元素数量是4294967295。如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。
命令 | 描述 |
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SCARD key | 获取集合的成员数 |
SDIFF key1 [key2] | 返回给定所有集合的差集 |
SDIFFSTORE destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SINTERSTORE destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 |
SISMEMBER key member | 判断 member 元素是否是集合 key 的成员 |
SMEMBERS key | 返回集合中的所有成员 |
SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
SPOP key | 移除并返回集合中的一个随机元素 |
SRANDMEMBER key [count] | 返回集合中一个或多个随机数 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SUNIONSTORE destination key1 [key2] | 所有给定集合的并集存储在 destination 集合中 |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
SET 应用场景
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
SET 操作介绍
SADD
语法:
SADD key member [member …]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
当 key 不是集合类型时,返回一个错误。
返回值:
被添加到集合中的新元素的数量,不包括被忽略的元素。
代码示例:
# 添加单个元素
redis> SADD bbs "discuz.net"
(integer) 1
# 添加重复元素
redis> SADD bbs "discuz.net"
(integer) 0
# 添加多个元素
redis> SADD bbs "tianya.cn" "groups.google.com"
(integer) 2
redis> SMEMBERS bbs
1) "discuz.net"
2) "groups.google.com"
3) "tianya.cn"
8、Redis SortedSet(有序集合)
SortedSet 介绍
Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。成员是唯一的,但是分数(score)却是可以重复的。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
命令 | 描述 |
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
ZCARD key | 获取有序集合的成员数 |
ZCOUNT key min max | 计算在有序集合中指定区间分数的成员数 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
ZINTERSTORE destination numkeys key [key ...] | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
ZLEXCOUNT key min max | 在有序集合中计算指定字典区间内成员数量 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合成指定区间内的成员 |
ZRANGEBYLEX key min max [LIMIT offset count] | 通过字典区间返回有序集合的成员 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员 |
ZRANK key member | 返回有序集合中指定成员的索引 |
ZREM key member [member ...] | 移除有序集合中的一个或多个成员 |
ZREMRANGEBYLEX key min max | 移除有序集合中给定的字典区间的所有成员 |
ZREMRANGEBYRANK key start stop | 移除有序集合中给定的排名区间的所有成员 |
ZREMRANGEBYSCORE key min max | 移除有序集合中给定的分数区间的所有成员 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
ZSCORE key member | 返回有序集中,成员的分数值 |
ZUNIONSTORE destination numkeys key [key ...] | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成员和元素分值) |
SortedSet 应用场景
排行榜应用,取TOP N操作这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
SortedSet 操作介绍
ZADD
语法:
ZADD key score member [[score member] [score member] …]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
score 值可以是整数值或双精度浮点数。
如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
对有序集的更多介绍请参见 sorted set 。
返回值:
被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
代码示例:
# 添加单个元素
redis> ZADD page_rank 10 google.com
(integer) 1
# 添加多个元素
redis> ZADD page_rank 9 baidu.com 8 bing.com
(integer) 2
redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"
# 添加已存在元素,且 score 值不变
redis> ZADD page_rank 10 google.com
(integer) 0
redis> ZRANGE page_rank 0 -1 WITHSCORES # 没有改变
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"
# 添加已存在元素,但是改变 score 值
redis> ZADD page_rank 6 bing.com
(integer) 0
redis> ZRANGE page_rank 0 -1 WITHSCORES # bing.com 元素的 score 值被改变
1) "bing.com"
2) "6"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"