您的位置:首页 > 数据库 > Redis

redis

2020-07-21 04:14 1581 查看

redis

第一部分之基础

redis介绍

Redis是一个开源的key-value存储系统。
支持的value类型包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

应用场景

1.配合关系型数据库做高速缓存:将高频次,热门访问的数据用redis做缓存,用户访问直接先到redis中去寻找数据,redis有缓存过则直接读取,没有缓存过,会去关系型数据库中搜索值,将此数据返回给用户的同时会存到redis中一份,降低了数据库的IO
2.实时计算中常常用于存储临时数据:存 放的数据应该具有以下特点
高频次、读写时效性高、总数据量不大和临时性的数据
下面redis支持存储不同格式数据的简单应用

和Hbase的简单对比

hbase是基于key-value方式的存储(数据存储方式和redis相同)不适合进行分析查询,支持写操作,hbase是将数据先放到写缓存,之后写入文件。但是hbase通常用于长期存储数据,数据量也远远大于redis,redis适合经常变化的数据,因为是在内存,存储效率更高,将访问批次高的临时数据缓存在redis中。

在linux中安装redis

1.下载redis安装包解压到自己指定的目录

tar -zxvf redis-3.2.1.tar.gz

2.进入到redis3.2.5 执行make命令,完成之后继续执行make install
如果执行make操作报 gcc:命令未找到,需要进行这个操作

yum install gcc-c++

3.查看默认安装目录 usr/local/bin

Redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何(服务启动起来后执行)
Redis-check-aof:修复有问题的AOF文件
Redis-check-dump:修复有问题的dump.rdb文件
Redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
Redis-cli:客户端,操作入口

4.启动
启动之前先将redis.conf文件备份到 usr/local/bin 目录下,修改里面的daemonize no 改成yes,让服务在后台启动

启动命令

1.启动redis服务

redis-server /usr/local/bin/redis-conf

2.启动客户端

redis-cli

3.测试,返回pang,就能正常使用了

127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

不同数据类型的不同命令

对key的操作:

查看当前库的所有键:keys *
判断某个键是否存在:exists <key>
删除某个键:del <key>
为键值设置过期时间,单位秒:expire <key><seconds>
查看还有多少秒过期,-1表示永不过期,-2表示已过期:ttl<key>
查看当前数据库的key的数量:dbsize
清空当前库:flushdb
通杀全部库(会触发rdb存盘):flushall,数据清除掉之后还有机会找回来

key-string

一个key对应一个value
命令

查询对应键值:get <key>
添加键值对:set <key><value>
设置键值的同时,设置过期时间,单位秒:setex <key><过期时间><value>
只有在 key 不存在时设置 key 的值:setnx <key><value>
将 key 中储存的数字值增1,只能对数字值操作,如果为空,新增值为1:incr<key>
将 key 中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1:decr<key>
将 key 中储存的数字值增减。自定义步长:incrby/decrby<key><步长>

redis的命令操作是命令原子性的,不会被线程调度机制打断,一旦这个线程开始就会执行到最后,不会切换到另一个线程,中断只能发生在指令之间。redis单命令的原子性主要得益于redis的单线程。
如果出现:

(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

错误信息是因为:Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。原因是强制关闭Redis快照导致不能持久化引起的。
解决方案:
运行config set stop-writes-on-bgsave-error no 命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。

key-set

key-set:能够起到去重的作用,Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)

1.同时设置一个或多个 key-value对:mset
2.同时获取一个或多个 value :mget

127.0.0.1:6379> mset 1007 ww 1008 jj 1009 zz 1010 gg
OK
127.0.0.1:6379> mget 1007 1008 1009
1) "ww"
2) "jj"
3) "zz"

3.将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略:sadd
4.取出该集合的所有值:smembers
5.判断集合是否为含有该值,有返回1,没有返回0:sismember
6. 删除集合中的某个元素:srem

127.0.0.1:6379> sadd 1015 jj kk ll zz
(integer) 4
127.0.0.1:6379> sismember 1015 ll
(integer) 1
127.0.0.1:6379> srem 1015 jj
(integer) 1
127.0.0.1:6379> smembers 1015
1) "ll"
2) "kk"
3) "zz"
127.0.0.1:6379>

7.返回两个集合的交集元素:sinter
7. 返回两个集合的并集元素:sunion
8. 返回两个集合的差集元素:看在谁的基础上减:sdiff

127.0.0.1:6379> sadd 1016 ss dd cc bb mm
(integer) 5
127.0.0.1:6379> sadd 1017 ss cc ee yy
(integer) 4
127.0.0.1:6379> sinter 1016 1017
1) "ss"
2) "cc"
127.0.0.1:6379> sunion 1016 1017
1) "yy"
2) "ss"
3) "bb"
4) "cc"
5) "ee"
6) "mm"
7) "dd"
127.0.0.1:6379> sdiff 1016 1017
1) "mm"
2) "dd"
3) "bb"
127.0.0.1:6379>

key-list

单值多键。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

1.从左边/右边插入一个或多个值:lpush/rpush
2.从左边/右边吐出一个值。值在键在,值光键亡:lpop/rpop

127.0.0.1:6379> lpush 1011 ee qq ee tt yy
(integer) 5
127.0.0.1:6379> rpush 1012 rr tt uu
(integer) 3
127.0.0.1:6379> lpop 1011
"yy"
127.0.0.1:6379> rpop 1011
"ee"

3.从列表右边吐出一个值,插到列表左边: rpoplpush

127.0.0.1:6379> rpoplpush 1011 1012
"qq"
127.0.0.1:6379> lpop 1012
"qq"

4.按照索引下标获得元素(从左到右):lrange
5.按照索引下标获得元素(从右到左):lindex
6.获得列表长度:llen

127.0.0.1:6379> lpush 1013 ss dd ff gg
(integer) 4
127.0.0.1:6379> lindex 1013 1
"ff"
127.0.0.1:6379> llen 1013
(integer) 4

key-hash

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里面的Map<String,Object>
k-<k-v,k-v,k-v…>

1. 批量设置hash的值:
hmset <key1>  <field1> <value1> <field2> <value2>
2.查看哈希表 key 中,给定域 field 是否存在:hexists key  <field>
3. 列出该hash集合的所有field和values:hgetall <key>
4. 为哈希表 key 中的域 field 的值加上增量 increment :hincrby <key> <field>  <increment>

测试:

127.0.0.1:6379> hmset 1019 city beijing name zhangsan sex man age 20
OK
127.0.0.1:6379> hexists 1019 name
(integer) 1
127.0.0.1:6379> hgetall 1019
1) "city"
2) "beijing"
3) "name"
4) "zhangsan"
5) "sex"
6) "man"
7) "age"
8) "20"
127.0.0.1:6379> hincrby 1019 age 5
(integer) 25
127.0.0.1:6379>

key-zset(sorted set)

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的没有成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表.

1.将一个或多个 member 元素及其 score 值加入到有序集 key 当中:zadd
2.返回有序集 key 中,下标在 之间的元素
带WITHSCORES,可以让分数一起和值返回到结果集。
有序输出从小到大:zrange [WITHSCORES]
3.同上,逆序按评分从大到小:zrevrange [WITHSCORES]
4.为元素的score加上增量:zincrby
5.删除该集合下,指定值的元素 :zrem
6.统计该集合,分数区间内的元素个数 :zcount
7.返回该值在集合中的排名,从0开始: zrank
测试:

127.0.0.1:6379> zadd 1020 89 ss 100 hh 45 kk 62 pp
(integer) 4
127.0.0.1:6379> zrange 1020 0 -1 WITHSCORES
1) "kk"
2) "45"
3) "pp"
4) "62"
5) "ss"
6) "89"
7) "hh"
8) "100"
127.0.0.1:6379> zrevrange 1020 0 -1 WITHSCORES
1) "hh"
2) "100"
3) "ss"
4) "89"
5) "pp"
6) "62"
7) "kk"
8) "45"
127.0.0.1:6379> zincrby 1020 20 ss
"109"
127.0.0.1:6379> zrem 1020 pp
(integer) 1
127.0.0.1:6379> zadd 1022 66 rr 77 ww 99 kk
(integer) 3
127.0.0.1:6379> zrank 1022 kk
(integer) 2
127.0.0.1:6379> zcount 1022  3
127.0.0.1:6379> zcount 1022 60 89
(integer) 2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: