Redis存储系统
1417.redis是什么?
redis是一款高性能的NOSQL系列的非关系型数据库
-----------------------------------------------------------------------------------------------
1418.redis相比memcached有哪些优势?
(1) 成本低
(2)查询速度快
(3)可存储多种格式,如key,value格式,文档格式,图片格式..
(4)可扩展性
-----------------------------------------------------------------------------------------------
1419.redis单机如何安装?
1. 官网:https://redis.io
2. 中文网:http://www.redis.net.cn/
3. 解压直接可以使用:
* redis.windows.conf:配置文件
* redis-cli.exe:redis的客户端
* redis-server.exe:redis服务器端
-----------------------------------------------------------------------------------------------
1420.redis有哪五种数据类型?
String, hash, list, set , sortedSet
-----------------------------------------------------------------------------------------------
1421.redis怎样后台运行?
redis.conf 文件中的 daemonize no 为 yes 并保存。
守护线程
-----------------------------------------------------------------------------------------------
1422.redis怎样绑定请求IP地址?
查找bind
-----------------------------------------------------------------------------------------------
1423.redis设置DB数量?
默认16个库(没有表空间概念)
通过-select 1 ,2选择
-----------------------------------------------------------------------------------------------
1424.redis持久化配置方式?
二种方式:
RDB持久化配置
Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,
在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息:
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
AOF持久化配置
在Redis的配置文件中存在三种同步方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
-----------------------------------------------------------------------------------------------
1425.set命令与setnx命令有什么区别?
set-存值
setnx,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果
-----------------------------------------------------------------------------------------------
1426.redis操作string类型,怎样指定有效期?
setex key seconds value
#将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。
-----------------------------------------------------------------------------------------------
1427.redis操作string, 怎样设置指定 key 的 value 值的子字符串?
setrange key offset value #用来替换子字符串
#用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。
#不存在的 key 当作空白字符串处理
-----------------------------------------------------------------------------------------------
1428.redis操作string,怎样一次性设置多个key的使用?
mset key value [key value ...]
#同时设置一个或多个 key-value 对。
-----------------------------------------------------------------------------------------------
1429.redis操作string,怎样获取 key 对应的 string 值?
get key
-----------------------------------------------------------------------------------------------
1430.redis操作string,怎样设置 key 的值,并返回 key 的旧值?
getset
-----------------------------------------------------------------------------------------------
1431.redis操作string,怎样获取指定 key 的 value 值的子字符串?
GETRANGE key start end
-----------------------------------------------------------------------------------------------
1432.redis操作怎样获取多个key对应的值?
mget key1 key2 ... keyN
-----------------------------------------------------------------------------------------------
1433.redis怎样对 key 的值做加加操作?
incr key
-----------------------------------------------------------------------------------------------
1434.redis怎样key的值 做减减操作
decr key
-----------------------------------------------------------------------------------------------
1435.redis操作string,怎样实现追加操作
append key value
-----------------------------------------------------------------------------------------------
1436.redis操作string,怎样获取指定 key 的 value 值的长度?
strlen key
-----------------------------------------------------------------------------------------------
1437.redis操作hash,怎样设置 hash field 为指定值?
hset key field value
-----------------------------------------------------------------------------------------------
1438.redis操作hash,怎样设置多个 hash field 为指定值?
hmset key field value [field value ...]
-----------------------------------------------------------------------------------------------
1439.redis操作hash,怎样获取指定的 hash field?
hkeys key
-----------------------------------------------------------------------------------------------
1440.redis操作hash,怎样获取全部指定的 hash filed?
hgetall key
-----------------------------------------------------------------------------------------------
1441.redis操作hash,怎样获取hash中元素个数?
hlen key
-----------------------------------------------------------------------------------------------
1442.redis操作hash,怎样删除hash中指定filed元素?
hdel key field [field ...]
-----------------------------------------------------------------------------------------------
1443.redis操作list:怎样在 key 对应 list 的头部添加字符串元素?
lpush subject java html5 android ios #从左到右的顺序在subject中依次插入四个元素到subject的表头部分
-----------------------------------------------------------------------------------------------
1444.redis操作list:怎样在 key 对应 list 的尾部添加字符串元素?
linsert key BEFORE|AFTER pivot value
-----------------------------------------------------------------------------------------------
1445.redis操作list:怎样设置 list 中指定下标的元素值(下标从 0 开始)?
lindex key index
-----------------------------------------------------------------------------------------------
1446.redis操作set:怎样向set 中添加元素?
add student zhangsan lisi wangwu #多个元素(名字)加入到集合 student 当中
-----------------------------------------------------------------------------------------------
1447.redis操作set:怎样删除名称为 key 的 set 中的元素 member
smembers
-----------------------------------------------------------------------------------------------
1448.redis操作sorted set:怎样向名称为 key 的 zset 中添加元素 member?
zadd language java php javascript
-----------------------------------------------------------------------------------------------
1449.redis操作sorted set:怎样删除名称为 key 的 zset 中的元素 member?
zrem key member
-----------------------------------------------------------------------------------------------
1450.【上机】redis单机版本的安装
Redis的安装
第一步,官网下载Redis 压缩包,地址:http://redis.io/download。stable表示稳定版.这里下载的是3.2.9版本
第二步,通过远程管理工具(这里使用的是xftp),将压缩包拷贝到Linux服务器中(这里存放到了/usr/local下面)
第三步,进入/usr/local目录,解压文件
tar -zxvf redis-3.2.9.tar.gz
此时在/usr/local中会出现一个redis-3.2.9的目录
第四步,进入redis-3.2.9目录,编译
cd redis-3.2.9
make
此时可能出现cc未找到的命令,原因是虚拟机系统中缺少gcc,安装一下gcc即可解决问题,所以需要先安装:
yum install gcc-c++
此时还可能出现 :致命错误:jemalloc/jemalloc.h:没有那个文件或目录 为解决这个问题,需要执行如下命令:
make MALLOC=libc
第五步,进入src目录,安装
make install
第六步,新增用户和组
groupadd redis
useradd -c Redis Server -s /sbin/nologin -d /var/lib/redis -g redis -G root
reids参数解释: -c 用户描述信息 -s 用户执行脚本,此处为安全考虑,redis用户是不允许远程登录,故使用/sbin/nologin -d 用户home目录,此处无需在/home目录下创建redis子目录,故将其定位于/var/lib/redis空目录中 -G 扩展用户组,即表示此用户同时属于root用户组
到此为止,redis安装完成
redis的启动
为了方便管理,将redis文件重的redis.conf配置文件和常用命令移动到统一文件夹中,这里常用命令都自动移动到了/usr/local/bin目录中,所以这里我直接把redis-3.2.9目录中的redis.conf文件也移动到了/usr/local/bin目录下:
[root@localhost redis-3.2.9]# mv redis.conf /usr/local/bin
此时直接执行命令启动redis:
./redis-server ./redis.conf
看到如下效果:
[root@localhost bin]# ./redis-server ./redis.conf
11164:M 10 Jul 19:02:02.049 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 11164
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
11164:M 10 Jul 19:02:02.071 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
11164:M 10 Jul 19:02:02.072 # Server started, Redis version 3.2.9
11164:M 10 Jul 19:02:02.072 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
11164:M 10 Jul 19:02:02.073 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
11164:M 10 Jul 19:02:02.073 * The server is now ready to accept connections on port 6379
^C11164:signal-handler (1499684525) Received SIGINT scheduling shutdown...
11164:M 10 Jul 19:02:05.537 # User requested shutdown...
11164:M 10 Jul 19:02:05.537 * Saving the final RDB snapshot before exiting.
11164:M 10 Jul 19:02:05.545 * DB saved on disk
11164:M 10 Jul 19:02:05.545 * Removing the pid file.
11164:M 10 Jul 19:02:05.545 # Redis is now ready to exit, bye bye...
表示启动成功,但此时是前台运行的,我们还需要让redis服务后台运行,所以Ctrl+C退出,然后编辑redis.conf文件,把其中的daemonize属性改为yes(表明需要在后台运行,默认为no)
[root@localhost bin]# netstat -tunpl | grep 6379
[root@localhost bin]# ls
dump.rdb redis-benchmark redis-check-aof redis-check-rdb redis-cli redis.conf redis-sentinel redis-server
[root@localhost bin]# vi redis.conf
修改,保存退出,再次启动redis:
[root@localhost bin]# ./redis-server ./redis.conf
[root@localhost bin]# netstat -tunpl | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 11172/./redis-serve
看到redis-serve占用了6379端口(redis的默认端口为6379).
启动redis的客户端:
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> keys *
(empty list or set)
启动成功!
-----------------------------------------------------------------------------------------------
1451.【上机】练习redis操作五种数据类型
1. 字符串
Redis中的字符串是一个字节序列。Redis中的字符串是二进制安全的,这意味着它们的长度不由任何特殊的终止字符决定。因此,可以在一个字符串中存储高达512兆字节的任何内容
示例:
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379>
在上面的示例中,set和get是Redis命令,name是Redis中使用的键,yiibai.com是存储在Redis中的字符串的值。
注 - Redis命令不区分大小写,如SET,Set和set都是同一个命令。字符串值的最大长度为 512MB
针对字符串,还有其他命令:
append key value
#如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾
#如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样
incr key
#将 key 中储存的数字值增一。
#如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
#如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
#本操作的值限制在 64 位(bit)有符号数字表示之内
incrby key increment
#将 key 所储存的值加上增量 increment 。
#如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
#如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
#本操作的值限制在 64 位(bit)有符号数字表示之内
mset key value [key value ...]
#同时设置一个或多个 key-value 对。
#如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 msetnx 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
#mset 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
setex key seconds value
#将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。
#如果 key 已经存在, setex 命令将覆写旧值
setnx key value
#将 key 的值设为 value ,当且仅当 key 不存在。
#若给定的 key 已经存在,则 SETNX 不做任何动作
setrange key offset value #用来替换子字符串
#用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。
#不存在的 key 当作空白字符串处理
strlen key
#返回 key 所储存的字符串值的长度。
#当 key 储存的不是字符串值时,返回一个错误
2. 散列表
Redis散列/哈希(Hashes)是键值对的集合。Redis散列/哈希是字符串字段和字符串值之间的映射。因此,它们用于表示对象。
示例:
127.0.0.1:6379> hset user loginname zhangsan #设置user对象的loginname属性的值为zhangsan
(integer) 1 #如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1
127.0.0.1:6379> hget user loginname #获取用户user对象的loginname属性的值
"zhangsan"
127.0.0.1:6379> hset user loginname lisi #再次设定user对象的loginname属性的值为lisi
(integer) 0 #如果哈希表中的域 field 已经存在且旧值已被新值覆盖,返回 0
127.0.0.1:6379> hget user loginname #再次获取user对象的loginname属性的值
"lisi"
127.0.0.1:6379>
hmset key field value [field value ...]
#同时将多个 field-value (域-值)对设置到哈希表 key 中。
#此命令会覆盖哈希表中已存在的域。
#如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作
hmget key field [field ...]
#返回哈希表 key 中,一个或多个给定域的值。
#如果给定的域不存在于哈希表,那么返回一个 nil 值。
#因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表
hlen key
#返回哈希表 key 中域的数量
hkeys key
#返回哈希表 key 中的所有域。
hincrby key field increment
#为哈希表 key 中的域 field 的值加上增量 increment 。
#增量也可以为负数,相当于对给定域进行减法操作。
#如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
#如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
#对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
#本操作的值被限制在 64 位(bit)有符号数字表示之内
hgetall key
#返回哈希表 key 中,所有的域和值。
#在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍
hexists key field
#查看哈希表 key 中,给定域 field 是否存在
hdel key field [field ...]
#删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略
hvals key
#返回哈希表 key 中所有域的值
3. 列表
Redis列表只是字符串列表,按插入顺序排序。您可以向Redis列表的头部或尾部添加元素 127.0.0.1:6379> lpush subject java html5 android ios #从左到右的顺序在subject中依次插入四个元素到subject的表头部分 (integer) 4 #返回subject 列表的长度 127.0.0.1:6379> llen subject # 返回列表 subject 的长度 (integer) 4 127.0.0.1:6379> lpop subject #移除并返回列表 subject 的头元素 "ios" 127.0.0.1:6379> llen subject #再次获取列表subject 的长度 (integer) 3 #弹出一个元素后,subject里面只剩下三个元素 127.0.0.1:6379> lrange subject 0 -1 #返回列表 key 中指定区间内的元素,0表示从收元素开始,-1表示最后一个元素 1) "android" 2) "html5" 3) "java" 127.0.0.1:6379> 列表的最大长度为2^32 - 1个元素(4294967295,每个列表可容纳超过40亿个元素)。 rpush key value [value ...] #将一个或多个值 value 插入到列表 key 的表尾(最右边)。 #如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。 #如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。 #当 key 存在但不是列表类型时,返回一个错误 rpop key #移除并返回列表 key 的尾元素。 lindex key index #返回列表 key 中,下标为 index 的元素。 #下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 #你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 #如果 key 不是列表类型,返回一个错误。 linsert key BEFORE|AFTER pivot value #将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 #当 pivot 不存在于列表 key 时,不执行任何操作。 #当 key 不存在时, key 被视为空列表,不执行任何操作。 #如果 key 不是列表类型,返回一个错误。 lrem key count value #根据参数 count 的值,移除列表中与参数 value 相等的元素。 #count 的值可以是以下几种: #count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。 #count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。 #count = 0 : 移除表中所有与 value 相等的值
4. 集合
Redis集合是字符串的无序集合
示例:
127.0.0.1:6379> sadd student zhangsan lisi wangwu #多个元素(名字)加入到集合 student 当中
(integer) 3 #被添加到集合中的新元素的数量,不包括被忽略的元素
127.0.0.1:6379> scard student # 返回集合 student 的基数(集合中元素的数量)
(integer) 3
127.0.0.1:6379> smembers student #返回集合 student 中的所有成员
1) "wangwu"
2) "lisi"
3) "zhangsan"
127.0.0.1:6379> spop student # 移除并返回集合中的一个随机元素
"wangwu"
127.0.0.1:6379> scard student #移除之后再看集合student的长度
(integer) 2
127.0.0.1:6379> smembers student #移除之后再观察集合student的所有元素
1) "lisi"
2) "zhangsan"
127.0.0.1:6379>
sdiff key [key ...]
#返回一个集合的全部成员,该集合是所有给定集合之间的差集。
#不存在的 key 被视为空集
sinter key [key ...]
#返回一个集合的全部成员,该集合是所有给定集合的交集。
#不存在的 key 被视为空集。
#当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)
sismember key member
#判断 member 元素是否集合 key 的成员
srem key member [member ...]
#移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
#当 key 不是集合类型,返回一个错误
sunion key [key ...]
#返回一个集合的全部成员,该集合是所有给定集合的并集。
#不存在的 key 被视为空集。
5. 有序集合
Redis可排序集合类似于Redis集合,是不重复的字符集合。 不同之处在于,排序集合的每个成员都与分数相关联,这个分数用于按最小分数到最大分数来排序的排序集合。虽然成员是唯一的,但分数值可以重复
示例:
# 将一个元素(java)及其 score 值(5)加入到有序集 language 当中
127.0.0.1:6379> zadd language 5 java
(integer) 1
#将多个元素(ios,android,html5,sql)及其score值(7,3,8,10)加入到有序集language中
127.0.0.1:6379> zadd language 7 ios 3 android 8 html5 10 sql
(integer) 4 #共添加成功4条数据
#返回有序集 language 的基数(成员的数量)
127.0.0.1:6379> zcard language
(integer) 5
#返回有序集 lanuage 中, score 值在 2 和 6 之间(默认包括 score 值等于 2 或 6 )的成员的数量
127.0.0.1:6379> zcount language 2 6
(integer) 2
#返回有序集 lanuage 中,指定区间内的成员,并按score从小到大排序
127.0.0.1:6379> zrange language 0 -1 withscores
1) "android"
2) "3"
3) "java"
4) "5"
5) "ios"
6) "7"
7) "html5"
8) "8"
9) "sql"
10) "10"
#返回有序集 language 中,成员 java 的 score 值
127.0.0.1:6379> zscore language java
"5"
127.0.0.1:6379>
6. 其他命令
del key [key ...]
#删除给定的一个或多个 key
exists key
#检查给定 key 是否存在
expire key seconds
#为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除
keys pattern
#查找所有符合给定模式 pattern 的 key 。
#KEYS * 匹配数据库中所有 key 。
#KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
#KEYS h*llo 匹配 hllo 和 heeeeello 等。
#KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
type key
#返回 key 所储存的值的类型
-----------------------------------------------------------------------------------------------
1452.什么是redis集群?redis集群原理?
-----------------------------------------------------------------------------------------------
1453.redis集群为什么至少为6台?
-----------------------------------------------------------------------------------------------
1454.redis有哪些特性?
-----------------------------------------------------------------------------------------------
1455.redis集群中slot是什么?有什么作用?
-----------------------------------------------------------------------------------------------
1456.redis集群中选举:容错机制是什么?
-----------------------------------------------------------------------------------------------
1457.redis集群如何进行安装?
-----------------------------------------------------------------------------------------------
1458.redis集群如何添加、删除节点?
-----------------------------------------------------------------------------------------------
1459.【上机】redis集群搭建
-----------------------------------------------------------------------------------------------
1460.【上机】练习redis cluster操作五种数据类型
-----------------------------------------------------------------------------------------------
1461.【上机】MyBatis与redis集群结合,实现缓存。
-----------------------------------------------------------------------------------------------
1462. 什么是Jedis,如何使用Jedis操作redis数据库
-----------------------------------------------------------------------------------------------
1463.【上机】使用Jedis操作数据库,联系Jedis操作命令
-----------------------------------------------------------------------------------------------
1464.【上机】使用虚拟机搭建Redis集群,实现数据库的负载均衡功能
get key