redis使用
redis介绍:
- redis是开源,BSD许可,高级的key-value存储系统.
- 可以用来存储字符串,哈希结构,链表,集合,因此,常用来提供数据结构服务.
redis和memcached对比:
- redis可以用来做存储(storge), 而memccached是用来做缓存(cache),这个特点主要因为其有”持久化”的功能.
- 存储的数据有”结构”,对于memcached来说,存储的数据,只有1种类型--”字符串”,而redis则可以存储字符串,链表,哈希结构,集合,有序集合.
Redis下载安装
1.访问redis官方站点redis.io来进行下载安装(下载稳定版即可stable)
2.解压源码并进入文件目录
3.直接使用make进行安装(redis不用configure),原因:源码包是编译过之后的源码
4.make完成之后使用make test来进行测试编译情况
5.如果想安装到你指定的目录的话:比如安装的/usr/local/redis; 使用 make PREFIX=/usr/local/redis install进行安装
6.make install完成后会有这几个文件如下:
redis-benchmark redis性能测试工具
redis-check-aof redis日志文件检测工(比如断电造成日志损坏,可以检测并修复)
redis-check-dump redis快照文件检测工具
redis-cli redis客户端
redis-server redis服务端
7.复制配置文件到redis安装目录
cp /配置文件路径/redis.conf /usr/local/redis
8.启动redis服务
/redis安装目录/redis/bin/redis-server ./redis安装目录下的配置文件/redis.conf 进行启动
连接redis /redis安装目录/redis/bin/redis-cli [-h localhost -p 6379 ]默认
9.如果想让redis在后台进程运行,需要编辑redis.conf配置文件,修改如下:
找到daemonize yes 一般默认是no改为yes就是允许后台进程运行
redis 对于key的操作常用命令:
- del key key1 key2..keyn 作用:删除一个或者多个键,返回值:返回删除key的数量
- rename key newkey 作用:修改key或给key赋值一个新key, 返回值:如果key已经存在,则newkey的值则覆盖原来的值
- renamenx key newkey 作用:把key修改为新的key,返回值:修改成功返回1,失败就返回0
- move key 作用:移动一个key
- randomkey 作用:返回一个随机的key
- exists key 作用:判断key是否存在,返回值:存在返回1,不存在则返回0
- type key 作用:检测key存储值的类型 (类型有:string,link,set,order set,hash)
- ttl key 作用:查询key的生命周期(就是看key是否过期),返回值:剩余周期秒数,注意:对于不存在的key或已过期的key/不过期的key都是返回-1,新版本不存在的key会返回-2
- expire key(整型) 作用:设置key的生命周期,以秒为单位
- pexpire key 作用:设置key的生命周期,以毫秒为单位
- pttl key 作用:以毫秒返回生命周期
- persist key 作用:把指定key设置为永久有效,redis默认不加设置生命周期的key都是永久有效的
redis字符串操作:
- set key value [ex 秒数]/[px 毫秒数][nx][xx] 存储数据,nx:表示key不存在时执行操作,xx:表示key存在时执行操作 注意:如果ex和px同时写,以后面的有效期为准
- mset key...keyn 作用:一次性设置多个键值 例如:meset key1 value1 key2 value2等
- get key 作用:获取key的值
- mget key.....keyn 作用:一次获取多个key的值
- setrange key offset value 作用:把字符串的offset偏移字节,改成value,例如:
- redis 127.0.0.1:6379> set name hello
- OK
- redis 127.0.0.1:6379> setrange name 2 x
- (integer) 5
- redis 127.0.0.1:6379> get name
- "hexlo"
- 注意:如果偏移量的长度大于字符串的长度,则该字符串自动使用0x00来进行替补
- append key value 作用:把value追加到key的原值上
- getrange key start stop 作用:是获取字符串中[start,stop]范围的值,注意:对于字符串的下标,左边是从0开始,右边从-1开始,例如:
- redis 127.0.0.1:6379> set name 'lijiangkun'
- OK
- redis 127.0.0.1:6379> getrange name 0 3
- "liji"
- redis 127.0.0.1:6379> getrange name 1 -2
- "ijiangku"
- 当start>=length,则返回空字符串
- 当stop>=length,则截取至字符结尾
- 如果start所处的位置在stop右边,返回空字符串
- getset key newvalue 作用:获取并返回旧值,设置新值
- incr key 作用:对指定key的值加1,并返回加1的值
- incrby key number 作用:一次可以加4或者多个int
- incrbyfloat key floatnumber 作用:可以为key增加浮点数值,4.6,6.8
- decr key 作用:在原来的key进行减1
- decrby key 作用:在原来的值减1或者4,7,8等
link链表结构
- lpush key value 作用:把值插入到链接头部
- rpop key 作用:返回并删除链表尾部元素
- rpush key/lpop 作用与上面正好相反
- lrange key start stop 作用:返回链表中[start,stop]中的元素,原则:左数从0开始,右数从-1开始
- lrem key count value 作用:从key链表中删除value的值,count>0从头部删除,count<0从尾部删除
- ltrim key start stop 作用:剪切key对应的链接,剪[start,stop]一段,并把该值重新赋给key
- lindex key index 作用:返回index索引上的值
- llen key 作用:计算链表中元素的个数
- rpoplpush source dest 作用:把source的尾部拿出,放在desc的头部
集合set相关
- sadd key value1 value2 作用:向集合key中增加元素
- srem value1 value2 作用:删除集合中集为value1,value2的元素
- spop key 作用:返回并删除集合中key中1个随机元素
- srandmember key 作用:返回集合key中,随机的一个元素
- sismember key value 作用:判断value是否存在key集合中
- smembers key 作用:返回集合中左右元素
- scard key 作用:返回集合元素中的元素个数
- smove source desc value 作用:把source中的value删除,并添加到desc集合中
- sinter key1 key2 key3 作用:求出key1,key2,key3三个集合中的交集,并返回
- sinterstore desc key1 key2 key3 作用:求出key1,key2,key3三个集合中的交集,并赋值给desc
- suion key1....keyn 作用:求出key1....keyn的并集,并返回
- sdiff key1....keyn 作用:求出key1....keyn的差集并返回
order set 有序集合
- zadd key source1 value1 souce2 value2.. 作用:添加元素,例如:
- redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lilei 21 lilei
- (integer) 3
- zrem key value1 value2... 作用:删除集合中的元素
- zremrangebyscore key min max 作用:按照socre来删除元素,删除socre在[min,max]之间的
- redis 127.0.0.1:6379> zremrangebyscore stu 4 10
- (integer) 2
- redis 127.0.0.1:6379> zrange stu 0 -1
- 1) "f"
- zremrangebyrank key start stop 作用:按排名删除元素,删除名次在[start,stop]之间的
- zrank key member 作用:查询member的排名(升序从0开始)
- zrevrank key member 作用:查询member的排名(降序从0开始)
- zrange key start stop [withscores] 作用:把集合排序后,返回名次[start,stop]的元素,默认是升序排序[withscores]作用是把socre也打印出来
- zrevrange key start stop 作用:把集合降序排序,取[start,stop]之间的元素
- zcard key 作用:返回元素的个数
- zcount key min max 作用:返回[min,max]区间内的元素数量
hash哈希数据类型
- hset key field value 作用:把key中的field域的值设置为value,如果没有field域,直接添加,如果有,则覆盖原field域的值
- hmset key field value ....fieldn valuen 作用:设置多个域,对应多个值
- hget key field 作用:返回key中的field域的值
- hmget key field field1...fieldn 作用:返回key中field,field1...fieldn域的值
- hgetall key 作用:返回key中,所有的域和值
- hdel key field 作用:删除key中field域
- hlen key 作用:返回key中元素的数量
- hexists key field 作用:判断key中有没有field的域
- hinrby key field value 作用:把key中的field的域增长(增长整型value)
- hinrby float jey field value 作用:把key中的field域增长(增长浮点值value)
- hkeys key 作用:返回key中所有的field
- kvals key 作用:返回key中所有的value
redis中的事务
- 1.redis只支持简单的事务
- 2.redis和mysql的事务对比
注意:在mutil后面的语句中, 语句出错可能有2种情况
1.语法就有问题,这种,exec时,报错, 所有语句得不到执行
2.语法本身没错,但适用对象有问题. 比如 zadd 操作list对象
Exec之后,会执行正确的语句,并跳过有不适当的语句.
悲观锁:给某个事务上锁,只能我自己操作
乐观锁:给某个事务上锁,我只要关注有没有人更改过某个事务
启用乐观锁:watch key:作用:监听key,keyn有没有发生过变化,如果发生过变化则事务取消
unwatch :作用:取消所有watch监听
redis持久化配置:(2中方式aof,rdb)
rdb快照的配置如下:
- save 900 1 // 900内,有1条写入,则产生快照
- save 300 1000 // 如果300秒内有1000次写入,则产生快照
- save 60 10000 // 如果60秒内有10000次写入,则产生快照
- 这3个选项都屏蔽,则rdb禁用
- stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入
- rdbcompression yes // 导出的rdb文件是否压缩
- Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
- dbfilename dump.rdb //导出来的rdb文件名
- dir ./ //rdb的放置路径
aof的配置:
- appendonly no # 是否打开 aof日志功能
- appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
- appendfsync everysec # 折衷方案,每秒写1次
- appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.同步频率低,速度快,
- no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
- auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
- auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
注意:
1.在dump rdb过程中,aof如果停止同步,会不会丢失?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作
2.aof重写是指什么?
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里.以解决 aof日志过大的问题.
3.如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: aof
4.2种是否可以同时用?
答: 可以,而且推荐这么做
5.恢复时rdb和aof哪个恢复的快?
rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行