nosql
redis是一种nosql,没有表结构,使用五种数据类型来完成存储。并且存储于内存中,周期性写入硬盘与log文件中。只有库的概念。
redis启动
windows:
redis-server.exe redis.windows.conf
另起一个cmd
redis-cli.exe -h 127.0.0.1(这里由于绑定的地址是这个,即使127.0.0.2等也指向主机,但是redis不识别) -p 6379(表示端口)
linux:
进入src目录下(之前需要编译,才能看到redis-server文件)
./redis-server ../redis.conf
另起一个命令窗口
同样进入src目录
./redis-cli 即可
redis关闭
windows可以直接关闭cmd
linux下在client端直接输入shutdown即可。
redis 配置
127.0.0.1> config get xxx
127.0.0.1> config set xxxx(key) xxxxx(value)
redis设置
redis中有几种形式:string,hash,list(列表),set(集合),zset(sort set有序集合)
删除数据 del key [field]
设置字符串键值对
setnx表示如果key存在了,就返回0,如果不存在,则插入新值,返回1。nx代表not exists
127.0.0.1 > set mykey myvalueget mykey
setnx mykey myvalue1
0
setex haircolor 10 red(设置此键值对有效期为10秒)
setnx email 1395843157@11.com
setrange email 11 gmail.com(从第十一下标开始将以后的相同数量字符换成gmail.com)
mset key1 value1 key2 value2 ….(批量设置键值对,失败返回0)
getset key1 value4 (设置key的新值,并返回原来的值,字面解释,先get,后set,所以key1填的是没有设置的新值,会报nil)
msetnx (用法与mset一样)
getrange mykey 0 5 (获取子字符串)
mget key1 key2 key3….
incr num1 (用于数字,自增加1操作,返回新值)
incrby num1 10 (用于增加指定值,并且如果key不存在,会设置key,value默认为0)–后面的数字为负数就是减。
对应的decr
decrby
append key heihei (在旧值末尾新增heihei)
strlen 获取键的长度。设置hash形式
127.0.0.1 > hset key field value
hget key field
127.0.0.1 > hmset key field value [filed value…..]
hmget key field
hmget key field [field…. ]
hgetall key
hm形式用于一次性设置多个域值,取值根据键,域来进行取。设置list形式
127.0.0.1:6379> lpush key value [value …]lpop key (弹出一个值)
lset key index value
lpushx key value(如果key不存在就失败)
lrange key start end
lrange key 0 -1 (0代表第一个,-1代表最后一个)。
llen key(返回长度)
lrem key count value (删除第几个value)
lindex key index (返回值)
ltrim key start end (将值截取出来,永久改变的)
linsert key before|after prvoit newvalue
rpush key value [value…]
rpushx key value
rpop key
rpoplpush key1 key2设置set形式
127.0.0.1:6379 >sadd key [value…]
scard key (返回数量)
smembers key (返回所有值)
sdiff key [key…] (返回差集)
sdiffstore destination key [key…]
sinter key [key…]
sinterstore destination key [key…]
sismember key member (判断member是不是key中成员)
spop key [count] (随机出来一个数,当没有数据时自动rm这个set)
srandmember key [count] (返回一个或者多个随机数)
srem key value (删除指定值)
sunion key [key..] (返回并集,由于还是set形式,所以里面不包含重复)
sunion destination key [key…]设置sorted set
127.0.0.1:6379 >zadd
键值操作命令
- keys * :表示取出所有键 keys my* 取出所有以my开头的键
- exists key :判断key是否存在
- del key :删除key
- expire key time :设置过期时间
- move key 库名 :从一个库移动到另一个库
- persist key :取消定时
- rename key new_keyname 重命名
- randomkey 从中随机返回一个键
- type key : 返回键的数据类型
补充:redis共有 0-15,16个数据库。客户端默认进入到0数据库。
服务器相关命令
- dbsize :返回当前数据库中key的数量
- select 0~15 :选择其中一个数据库
- ping :查看是否有响应。
- quit/exit :断开与服务器连接
- info : 返回redis版本等信息
- flushdb :清空当前数据库数据
- config get xxx :获取对应参数信息
- flushall :删除所有数据库中的键
redis安全性设置
- 设置密码 :redis.conf 文件中,找到requirepass , 并设置自己的requirepass 例如:requirepass wangxinyu,即设置密码为wangxinyu
- 两种方式输入密码:1. …/redis-cli -a wangxinyu 2. 进入到客户端后 : auth wangxinyu 使用auth命令进行设置。设置密码不影响进入客户端,但是不具有操作redis的权限。
主从复制
什么是主从复制?
主从复制就是主服务器向从服务器发送复制命令,并得到响应的过程。
redis主从结构:redis的master(主)服务器连接多个slave(从)服务器,并且从服务器之间可以相互连接,一般情况下从服务器统一连接到一个从服务器中,如果有一天这个master 坏掉,那么这个slave就变成了master继续为用户提供服务。
主从复制过程:redis主从复制与对外提供服务是并行的。
1. slave向master请求同步
2. master将db快照保存到文件中,发给slave
3. slave将file保存到硬盘中
4. 此期间,master仍接收client发送来的数据以及请求。
做法 1.配置slave服务器上的redis.conf文件,设置masterauth (master的密码),以及slaveof (设置master主机ip和port),记住,要关闭各自防火墙。
2.启动master所在虚拟机。开启redis服务
3.启动slave所在虚拟机,开启redis服务(会看到连接信息)
4.开启各自客户端,使用master端set值,在slave端get,可以get到
事务处理
127.0.0.1 6379 > multi ---开启一个事务
> set skey1 10
> set skey1 11
> exec
>
multi命令开启事物,里面的命令都被存储在一个queue中,exec开始执行里面命令。
如果我们不想进行事务上下文,discard命令(在上面exec处换成discard)。意思是,清空multi的事务队列,回滚。
乐观锁的实现(类似事务一致性)
乐观锁是版本控制软件常用的一种锁。
127.0.0.1 6379 > watch skey1 -- 监控在事务开始与结束期间skey1这个键是否被修改
> multi --开始事务
> set skey1 12
> ---这两个命令之间再开一个客户端,进行skey1值修改,会被watch监控到,然后执行exec,返回nil,执行不成功。
> exec
> (nil)
要想清除watch监控,exec,discard,unwatch命令都可以清除。
redis事务回滚
redis执行事务时,与传统数据库不同,redis的事务执行时,将内部可执行的命令成功执行,不成功地命令不执行。存在隐患。
持久化
snappshotting 快照,保存的是数据,服务默认方式,保存到dump.rdb文件中。我们可以配置执行保存的条件: save 900 10 :900秒内如果有超过10个key被修改,就执行保存。
append-only file 方式 :保存修改,增加,删除操作。由于每一次快照间会有间隔,那么在这之间如果服务器down掉,那么就会造成最后一次快照后的修改完全丢失,那么为了避免,我们使用aof方式,记录这些操作。
恢复时,恢复到最后一次快照,并重新执行这里的操作。通过在配置文件中配置:appendfsync always 每做一个操作机会同步到这个文件中。性能会差一些 appendfsync everysec :每秒同步一次。性能可以。存在丢失一些操作的危险。appendfsync no :让os自己判断何时进行备份,听os的。修改这个还需要先修改:appendonly 字段,默认为no,表示不开启,改为yes
消息发布与订阅
pub(publish)/sub(subscribe),一个客户端通过publish命令进行发布消息。设置了subcribe命令定制接收特定消息的客户端可以进行接收。
具体操作:
客户端1进行订阅:127.0.0.1 6379 > subscribe tv1
客户端2进行订阅:127.0.0.1 6379 > subscribe tv1 tv2 ...
客户端3进行发布:127.0.0.1 6379 > publish tv1 wangxinyu tv2 heheda(返回的数值代表有几个客户端在监听此消息)
此时,客户端1会接受到wangxinyu,,客户端2接收到:wangxinyu,heheda
redis虚拟内存
由于redis是用内存来存储文件,那么会占用很大内存,于是,虚拟内存就是将redis中暂时不用的数据交换到硬盘上,叫做虚拟内存。(2.4版本以后,取消的对vm的设置)