Linux Redis——Redis 数据库缓存服务

数据库缓存服务——Redis

一:缓存服务器简介

许多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的官网:redis.io

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.yum安装
安装redis的仓库:

[root@vc ~]# yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 

指定源安装redis:

[root@vc ~]# yum --enablerepo=remi install redis -y

启动redis并做开机启动:
[root@vc ~]# systemctl start redis
[root@vc ~]# systemctl enable redis

设置redis.conf,允许远程登录:
[root@vc ~]# vim /etc/redis.conf
bind 127.0.0.1 改为 bind 0.0.0.0 (可选)

登陆redis
[root@vc ~]# vim /etc/redis.conf
[root@vc ~]# systemctl restart redis
[root@vc ~]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name vc
OK
127.0.0.1:6379> get name
"vc"
127.0.0.1:6379> 

2.编译安装最新版

下载源码包:

[root@vc ~]# wget http://download.redis.io/releases/redis-6.0.7.tar.gz

解压到指定目录下:
[root@vc ~]# tar xf redis-6.0.7.tar.gz -C /usr/local/

切换到解压目录下进行编译安装:
[root@vc ~]# cd /usr/local/redis-6.0.7
[root@vc ~]# 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@gitlab redis]# cd deps/
[root@gitlab deps]# make lua hiredis linenoise

继续make
[root@vc ~]# cd /usr/local/redis-6.0.7/src && make test

注意:6版本的在执行make all 的时候会报以下的错误:
make: *** [server.o] Error 1
解决方案:更新gcc版本


[root@vc ~]# yum -y install centos-release-scl
[root@vc ~]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@vc ~]# scl enable devtoolset-9 bash
[root@vc ~]# echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
[root@vc ~]# gcc -v

报错解决方案
[root@vc-server-11 src]# make test
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1
[root@vc-server-11 src]# yum -y install tcl

解决完后继续执行make all
运行:
[root@vc ~]# ./redis-server

查看版本信息:
[root@vc ~]# ./redis-cli --version
redis-cli 6.0.7
[root@vc ~]# ./redis-server --version
Redis server v=6.0.7 sha=00000000:0 malloc=libc bits=64 build=924e64be34b50747

以守护进行运行redis,因为不用守护进行需要一直开启redis窗口
[root@vc src]# ./redis-server /usr/local/redis-6.0.7/redis.conf
1148:C 07 Sep 2020 15:49:54.543 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1148:C 07 Sep 2020 15:49:54.543 # Redis version=6.0.7, bits=64, commit=00000000, modified=0, pid=1148, just started
1148:C 07 Sep 2020 15:49:54.543 # Configuration loaded
[root@vc-server-2 src]# ps aux | grep redis
root 1149 0.0 0.0 40628 2124 ? Ssl 15:49 0:00 ./redis-server 127.0.0.1:6379
root 1154 0.0 0.0 9096 680 pts/1 S+ 15:50 0:00 grep --color=auto redis

注意:关闭redis进程需要使用kill进行管理
扩展:设置系统进程启动 Redis
先编辑配置文件,然后在把配置文件拷贝到/etc/redis下

vim /usr/local/redis-6.0.7/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@vc-server-2 src]# mkdir /etc/redis
[root@vc-server-2 src]# cp /usr/local/redis-6.0.7/redis.conf /etc/redis
开机自启动,将redis的启动脚本复制一份放到/etc/init.d目录下
[root@vc-server-2 src]# cp /usr/local/redis-6.0.7/utils/redis_init_script /etc/init.d/redis
[root@vc-server-2 src]# vim /etc/init.d/redis
REDISPORT=6379
EXEC=/usr/local/redis-6.0.7/src/redis-server
CLIEXEC=/usr/local/redis-6.0.7/src/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis.conf"
[root@vc-server-2 src]# systemctl daemon-reload
[root@vc-server-2 src]# systemctl start redis
[root@vc-server-2 src]# 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

四: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配置文件

1、是否后台运行
daemonize no/yes
2、默认端口
port 6379
3、AOF 日志开关是否打开
appendonly no/yes
4、日志文件位置
logfile /var/log/redis.log
5、RDB 持久化数据文件
dbfilename dump.rdb
6、指定IP进行监听
bind 10.0.0.51 ip2 ip3 ip4
7、禁止protected-mode
protected-mode yes/no (保护模式,是否只允许本地访问)
8、增加requirepass {password}
requirepass root9、在redis-cli中使用

3.数据持久化
开启持久化功能后,重启redis后,数据会自动通过持久化文件恢复!

(1、redis持久化 – 两种方式

redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File仅追加文件)。
·
RDB(Redis DataBase):是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;

特点:
(1.周期性
(2.不影响数据写入 #RDB会启动子进程,备份所有数据。当前进程,继续提供数据的读写。当备份完成,才替换老的备份文件。
(3.高效 #一次性还原所有数据
( 4.完整性较差 #故障点到上一次备份,之间的数据无法恢复。

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默认开启:

[root@redis-master src]# cd ..
[root@redis-master redis]# vim redis.conf
#dbfilename:持久化数据存储在本地的文件
dbfilename dump.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

(2、客户端使用命令进行持久化save存储:

方式一
[root@redis-master src]# ./redis-cli -h 192.168.246.202 -p 6379 save #前台进行存储
OK
方式二
./redis-cli -h ip -p port bgsave #后台进行存储
注意:每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。

(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 “”

(5、确保写命令会被正确地追加到 AOF 文件的末尾。
注意:
执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。
执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能。
别忘了在 redis.conf 中打开 AOF 功能! 否则的话, 服务器重启之后, 之前通过 CONFIG SET 设置的配置不会生效, 程序会按原来的配置来启动服务器。

5.数据恢复
将数据拷贝到另外一台新的服务器,执行以下命令:
注意:先将新机器的redis停止,将数据拷贝到新机器定义的目录下,并覆盖原有的数据

[root@vc-server-12 ~]# redis-cli
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/data"
127.0.0.1:6379> quit
[root@vc-server-12 ~]# systemctl start redis
[root@vc-server-12 ~]# redis-cli
127.0.0.1:6379> get cv
"vc"

五:Redis 管理

1.Redis 基本数据类型

[root@vc-server-12 ~]# redis-cli
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/data"
127.0.0.1:6379> quit
[root@vc-server-12 ~]# systemctl start redis
[root@vc-server-12 ~]# redis-cli
127.0.0.1:6379> get cv1
"vc"

在这里插入图片描述

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
......

根据输出可以看到 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 get
127.0.0.1:6379> help get
GET key
summary: Get the value of a key
since: 1.0.0
group: string

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 个键值对。

在这里插入图片描述

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
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。
在这里插入图片描述

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"

7.Redis SET(集合)
SET 介绍
Set类型看作为没有排序的字符集合。Set可包含的最大元素数量是4294967295。如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。
在这里插入图片描述

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多亿个成员)。
在这里插入图片描述

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"

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值