Redis基本信息
1.redis支持16个数据库(0,1,2…15)
2.单个key的大小支持512M
3.中文错误时
127.0.0.1:6379> set China 中国
OK
127.0.0.1:6379> get China
“\xe4\xb8\xad\xe5\x9b\xbd”
解决 加-raw
[root@localhost redis]# ./bin/redis-cli --raw
127.0.0.1:6379> get China
中国
127.0.0.1:6379>
Redis基本命令
1.删除键
del key
2.判断键是否存在
exist ket
存在返回1
不存在返回0
3.设置key过期时间
expire key second
默认永久-1
无效-2
其他为具体时间
pexpire key millsecond(毫秒计数)
4.返回key的剩余时间
ttl key
5.移除key的过期时间,key永久保存
persist key
6.查找所有符合通配符模式的key
keys pattern
7.从当前数据库中随机返回一个key
randomkey
8.修改key名字
rename oldkey newkey
9.移动key到某个数据库中
move key db
注意返回0时表示移动失败,比如移动的key在另外一个数据库中已经存在了
10.返回key的类型
type key
String
1.设置key value
set key value
注意区分大小写
当key 存在的时候覆盖
setnx key value
当key不存在的时候才会设置成功
2.取值
get key
3.取值的截取值
getrange key start end(包括end的值)
4.取出旧值并赋值新值
getset key value
返回旧值,之后再get key 得到新的值
5.返回值的长度
strlen key
6.自增自减
incr key
decr key
不存在就创建为0,再自增/减1
前提是value为整数
具有原子性操作,多线程访问不会有问题
incrby key num
增加num,同理decrby
Hash
适合存储一个对象
如:user(name,id,age…)
1.赋值语法
hset hashname fildname value
如:hset user1 name lsq
hmset hashname fildname1 value1 fildname2 value2…
对多个键值对进行赋值
如:hmset user1 age 22 id 1
2.取值语法
hget hashname fildname
取一个哈希表的一个域
hmget hashname fildname1,fildname2,fildname3…
取许多值
hgetall hashname
获取所有的值
hkeys hashname
获取所有的key值
hlen hashname
获取keys的数量
3.删除语法
hdel hashname fildname
其他的增加同string命令只是在前面加了h,如hincrby hashname fildname num
linux下载hiredis
1.获取压缩包
wget https://github.com/redis/hiredis/archive/v0.14.0.tar.gz
2.解压缩用tar命令,压缩到当前文件
3.进入压缩文件,用make命令编译安装
OK!
如何使用暂时没学!!!
Redis订阅和发布
订阅命令
subscribe channal1,channal2…
发布消息
publish patter(channals)
如:
开启一个客户端订阅消息
redis 127.0.0.1:6379> SUBSCRIBE channal1
subscribe
channal1
1
另一个客户端发布消息
redis 127.0.0.1:6379> PUBLISH redisChat hello
(integer) 1
之后订阅的客户端更新了内容为
127.0.0.1:6379> subscribe channal1
subscribe
channal1
1
message
channal1
hello
相当于一种实时通讯,我感觉是这样
redis多数据库
redis的数据库支持16个,每个数据库就是从0到15
1.切换数据库命令
select dbnum
2清空当前数据库的所有key
fushdb
3.清空redis所有数据库的key
flushall
redis事务
redis事务可以一次执行多个命令
为什么需要事务,比如:A向B转账50,这虽然是一句话,但是实际上这进行了两个操作:
A-50
B+50
这种情况下就需要事务。
操作如下:
127.0.0.1:6379> set count:a 100
OK
127.0.0.1:6379> set count:b 10
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> get count:a
QUEUED
127.0.0.1:6379> get count:b
QUEUED
127.0.0.1:6379> decrby count:a 50
QUEUED
127.0.0.1:6379> incrby count:b 50
QUEUED
127.0.0.1:6379> exec
(1) “100”
(2) “10”
(3) (integer) 50
(4) (integer) 60
127.0.0.1:6379>
redis在看到 multi 命令之后,会将接下来的命令放入队列,当输入exec之后,命令全部输入完成,则一次执行。
其他:
1.取消事务的执行
discard
如果代替exec就是multi之后的命令没有用,取消这个事务的创立
2.如果事务中一个命令错误,并不会影响其他命令的执行,会在执行的时候报错(如你对一个字符串进行自加1);但是如果是命令语法错误,则这个事务报废,如命令set你打成了sset
3.监视key
为啥需要监视key?
比如A有10元,B有0元,A想给B转10元,
当客户端1在进行事务命令创立时,
突然客户端2把A的账户减了5元,
那么当你A就只剩5元无法给B转账10元了,事务无法完成(实际上不会报错,但是A变成了-10)。
简而言之也是一个多进程操作同一个key出现的问题。怎么去解决,这就用到了两个命令:
watch key1 key2 key3…
unwatch key1 key2 key3…
操作如下:
127.0.0.1:6379> watch count:a
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby count:a 10
QUEUED
127.0.0.1:6379> incrby count:b 10
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379>
以上演示的是当事务进行中的时候有另一个客户端修改了count:a的值,那么就会使这个事务报废无法执行。
unwatch命令一般用于如果你在设置watch的情况下,一直执行事务失败,如果你想取消监视,则用unwatch,如果你的事务执行执行成公exec会充当unwatch,或者是你discard了,也不需要再输入unwatch.
redis持久化
数据被存放于:
1.内存,高效,但是如果机器down数据没保存会丢失
2.硬盘,慢,但是数据不会丢失
redis提供了两种持久化的方式:
1.RDB
- rdb是默认的持久化方式。可以在redis文件找到一个dump.rdb的文件。
- rdb是一种快照方式
- 优点,保存数据极快,恢复数据极快
- 缺点,会占用很大的内存,一符合条件就会进行快照,快照条件:
- 服务器正常关闭
- key满足一定条件,在redis.conf里面设置条件,如 save 900 1,表示在900秒钟,至少有一个key发生改变,会进行快照
2.AOF
rdb还有一个缺点就是当你在最后一次快照之前,机器突然shutdown,你还没来得及快照的时候,那么内容就会丢失。但是aof不会这样。
- aof主要是记录每一条命令
- 每当数据库重启时,都会执行aof所有的命令来重整数据库,恢复到最新的状态
- 缺点,命令越来越多,文件越来越大,并且许多命令都是多余的