redis学习之--初识redis(一)

目录

一、介绍及安装redis

二、数据结构

三、操作使用  参考Redis命令中心   Redis 命令参考

1、键命令Key

2、字符串string

3、双向链表list

4、集合set

5、有序集合zset

6、哈希hash

四、优化操作

1、snappshoting快照,默认开启

2、append only file追加写 aof

3、测试redis的并发  redis-benchmark

五、消息队列操作(如何通过代码操作


 


一、介绍及安装redis

1、介绍

RedisRemote Dictionary Server ),即远程数据服务,是由C语言编写的。开源的。是一个高性能的(key/value)分布式内存数据库。
Redis部分支持事务,也就是成功的不变只失败的回滚;oracle必须完全成功或失败。。。下载在github上。

redis的官网:https://redis.io/ 
redis的中文官网:http://redis.cn/ 
redis在github上的网站:https://github.com/antirez    redis的开发者:antirez
redis下载地址:https://github.com/MicrosoftArchive/redis/releases 
redis和memecache---内存缓存数据库;mongodb将数据存储到磁盘上
Redis 命令参考

2、什么场合使用

1、Sort Set:排行榜应用,取top n操作,例如:sina微博热门话题
2、List:获得最新的N个数据或某个分类的最新数据。l和r的存在。
3、计数器应用
4、Set:获得共同好友
5、Set:防攻击系统,例如黑白名单

能干嘛:
    内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
    取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
    模拟类似于HttpSession这种需要设定过期时间的功能
    发布、订阅消息系统
    定时器、计数器    

3、对比memecache

①Redis不仅仅支持简单的k/v类型的数据,同时还提供Iist,set,zset,hash等数据结构的存储。
②Redis支持 master-slave(主一从)模式应用。
③Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
④Redis单个value的最大限制是1GB,memecache只能保存1MB的数据

一般情况下使用,没什么区别。如果只是储存一些简单的字符串,用memecache,因为它小一些,且多核支持多线程。redis是单线程,只能排队阻塞操作了。

Redis 与其他 key - value 缓存产品有以下三个特点:
    Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
    Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
    Redis支持数据的备份,即master-slave模式的数据备份

4、linux下安装  参考 Redis的下载、安装与启停——linux版(二)正式商用

5、Windows下安装  参考 Redis的下载、安装与启停——Windows版(二)自己玩玩

6、命令行客户端使用

①cmd命令窗口,cd 到安装目录下

②set和get命令测试,成功见上图。

7、redis基本套路
起效是1 或>1  
不起效0 或nil 或抛出error  
count > 0 从头往尾操作;count < 0 从尾往头操作;count = 0 操作所有
一般不抛出报错信息,执行不存在的东西只会返回0。。。大大减少了写代码判空的处理,大大减少了异常的处理。如:del、srem等指令
对于没有的键、field等自动创建;删除不存在的也是返回0,而不是抛出异常。。。大大减少了写代码判空的处理,大大减少了异常的处理。

二、数据结构

  • redis是key-value的数据结构,每条数据都是一个键值对
  • 键的类型是字符串
  • 注意:键不能重复
  • 值的类型分为五种:
    • 字符串string
    • 哈希hash
    • 双向链表list
    • 集合set
    • 有序集合zset

三、操作使用  参考Redis命令中心   Redis 命令参考

1、键命令Key

⑴key的命名规则不同于一般语言,键盘上除了空格、\n换行外其他的大部分字符都可以使用。
像“my key”和“mykey \n”这样包含空格和换行的key是不允许的。
⑵我们在使用的时候可以自己定义一个Key的格式。例如 object-type:id:field
Key不要太长。占内存,查询慢。
Key不要太短。像u:1000:pwd就不如user:l000:password可读性好

①keys pattern:返回匹配指定模式的所有key。pattern参数支持正则表达式。
? 问号代表前面的字符最多只可以出现一次(0次、或1次)
* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)
+ 号代表前面的字符必须至少出现一次(1次或多次)
       (a)查看所有键 keys *
       (b)查看名称中以a开头的键 keys 'a*'
       (c)查看名称中包含a的键     keys '*a*'
       (d)查看名称中包含a的键,?占位符,一位     keys '?a?'
②exists key
:判断指定key是否存在,存在返回1,不存在返回0
③type key:查看键key对应的value类型
④rename oldkey newkey:重命名
⑤expire key seconds:为key指定过期时间,单位为秒。过期后该key不再存在=删除:keys * 无。如活动商品期限为3天设置
⑥ttl key:返回key的剩余过期秒数。未过期,返回剩余时间;负数,-1表示永不过期,-2表示已过期
⑦del key1 key2...keyN:删除,通用。不经常使用,一般都是设置过期时间,然后自动被移除
redis默认提供了16个库,下标从0开始。从配置文件redis.windows.conf/redis.conf中可以看到。如下图:
⑧select db-index:选择数据库
⑨dbsize:返回当前数据库的key数量
⑩move key db-index:将key从当前数据库移动到指定数据库
⑾flushdb:删除当前数据库中所有key
⑿flushall:删除所有数据库中的所有key



2、字符串string(单值单value)

string是redis最基本的类型。如果只用string类型,redis可以被看作是加上持久化性的memecache。
它在Redis中是二进制安全的。这意味着redis的string可以包含任何格式的数据,包括jpg图片、序列化对象、JSON对象描述信息等。
单个value值最大上限是1G字节(有的说是512M)。

保存/修改命令
①set key value
:设置key对应的值为string类型的value。设置的键不存在为添加,若已存在,则为修改。
②mset key1 value1...keyN valueN:一次设置多个key的值
setex key seconds value:设置key对应的value的同时设置过期时间,以秒为单位。等同于将set key value和expire key seconds两个命令放到MULTI/EXEC块中执行。由于setex是原子的。相比连续执行上面两个命令,它更快。因此,当使用Redis做缓存使用时,这个操作更常用。当key 已经存在时,setex会覆盖旧值。
④setnx key value:『SET if Not eXists』的简写。如果不存在,则 SET;存在,则不做任何动作。返回结果0失败,1成功。---作用:避免Java中的if判空操作。底层是要判断的,存在就不处理了,直接返回失败。
④msetnx key1 value1 key2 value2...:设置多个key-value 对。返回结果0失败,1成功。msetnx 是原子性的,所有字段要么全被设置,要么全不被设置
⑤append key value:给指定key的字符串值追加value,结果返回字符串长度
⑥setrange key offset value:设置指定区间范围内的值,从0开始。等同于replace

获取命令
get key:获取key的值,不存在返回nil
mget key1 key2...keyN:一次获取多个key的值
③strlen:返回key长度
④getrange/substr key start end:  (在 <= 2.0 的版本里,叫作 SUBSTR;>= 2.4.0 版本,叫作 GETRANGE)
获取指定区间范围内的值,一般从0开始。getrange key 0 -1    # 列出所有元素

删除命令键命令del

其他命令
incr key:对key的值做加1操作,并返回新的值
②decr key:同上,但是做的是减1操作,并返回新的值。
③incrby key integer:同incr,加指定值
④decrby key integer:同decr,减指定值
memecache不支持负数,redis支持负数。对未设置的key直接计数操作,memecache报错,redis支持。

3、双向链表list(单值多value)

List底层是一个双向链表,链表的元素内容为string。按照插入顺序进行排序。通过push、pop命令可以进行“从链表的头部或尾部增加或删除”的操作。头部也叫left,l命令,尾部也叫right,r命令。这使得list既可以用作栈,也可以用作队列。
栈        先进后出  同一端进出
对列    先进先出  一端进,另一端出

性能总结:
1、是一个字符串链表,left、right都可以插入添加;
2、如果键不存在,创建新的链表;
3、如果键已存在,新增内容;
4、如果值全移除,对应的键也就消失了(empty list or set);
5、链表的操作无论是头和尾效率都极高,但如果是对中间元素进行操作,效率就很惨淡了。

增加命令
①lpush key value1 value2...valueN
:在key对应list的头部添加字符串元素。类似数组。返回 key对应list的长度
rpush key value1 value2...valueN:同上,在尾部添加
lindex key index:按照索引下标获取元素(从上到下,从0开始)
linsert key before|after 现有元素 新元素:在指定元素的前或后插入新元素

获取命令
       start stop 为元素的下标索引;
       索引从左侧开始,第一个元素为0;
       索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素。 lrange key 0 -1:列出所有元素
①lrange key start stop:返回指定区间内的元素,下标从0开始
       索引从左侧开始,第一个元素为0;
       索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素
②lset key index value:设置指定索引位置的元素值。与lindex一组。lindex:获取;lset:设置
③llen key:返回 key对应list的长度,key不存在返回0,如果key对应类型不是list返回错误
ltrim key start end:开始index,结束index。截取指定范围内的值后再赋值给key,下标从0开始 
      命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
      动作1:将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
      动作2:将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
      完成后,source 元素被弹出减少,destination元素增加。相当于把source的最后一个元素添加到destination列表做头元素
      destination可以不存在,默认创建。
⑤rpoplpush source destination:destination 目的列表。返回被弹出的元素。
注意:如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。

删除命令
       将列表中前count次出现的值为value的元素移除
       count > 0:从头往尾移除
       count < 0:从尾往头移除
       count = 0:移除所有
①lrem key count value:删除count个指定元素,count > 0时,从头部删除(从上到下);count < 0,从尾部删除
②rpop key:从list的尾部删除元素,并返回删除元素
③lpop key:从list的头部删除元素,并返回删除元素

4、集合set(单值多value)

redis的set是string类型的无序集合,不允许有重复元素。通过HashTable实现的。
set元素最大可以包含 2的32次方-1 个元素。
set集合除了基本的添加和删除操作外,最常用的操作是取集合的并集union,交集intersection,差集difference。通过这些操作可以很容易的实现QQ/sns中的好友推荐功能。集合没有修改操作。

 增加命令
①sadd key member1 [member2...memberN]
:添加string元素到key对应的set集合中。相同元素不重复添加,返回成功添加的元素个数(重复元素不计算);key对应的set不存在返回错误。

 获取命令
①smembers key:返回key对应的所有元素,结果是无序的
②sismember key member:判断member是否在set中,存在返回,不存在返回0
③scard key:返回set的元素个数

      count > 0 且 < 集合基数,返回一个包含 count 个元素的数组,数组中的元素各不相同。
      count > 0 且 >= 集合基数,那么返回整个集合。
      count < 0,返回一个数组,数组中的元素会重复出现,数组的长度为 count 的绝对值,与集合基数无关
④srandmember key [count]:随机返回集合中的 一个/count个 元素,不改变原key。返回随机的元素或数组。适用场景:随机抽出几个,,,比如中奖的人、砸金蛋等活动。
      spop随机出栈  且 count > 0 
⑤spop key [count]:随机移除返回集合中的 一个/count个 元素,改变原key。返回被移除的随机元素或数组。

 删除命令
①srem key member [member]
:移除指定元素。成功返回1,若元素不存在返回0。因为元素不存在也不报错,所以可以用来“去重”操作
②smove key1 key2 member:从key1对应set中移除member并添加到key2对应的set中

 常用“数学集合类”命令
①sinter key1 key2...keyN
:返回所有给定key的交集--代码也能实现,但是这是在内存中完成的,速度很快
②sunion key1 key2...keyN
:返回所有给定key的并集--代码也能实现,但是这是在内存中完成的,速度很快
③sdiff key1 key2...keyN
:返回所有给定key的差集--代码也能实现,但是这是在内存中完成的,速度很快。在第一个set里面而不在第二个set里面。

需求:
xx1FR: xx3  xx4  xx5  xx6  xx2 
xx2FR: xx7  xx8  xx5  xx6  xx1    ---可以实现好友推荐等功能

5、有序集合zset

和set一样,sorted set也是string类型的无序集合,不允许有重复元素。没有修改操作。
不同的是每个元素都会关联一个权(double类型的score)。通过权值可以有序的获取集合中的元素。
zset的string是唯一的,但权(score)却可以重复。

 增加命令:
① zadd key score1 member1 [score2 member2 ...]
:添加元素到集合,相同元素不重复添加。返回成功添加的元素个数(重复元素不计算)
②zincrby key incr member:按照incr幅度增加对应member的score值,返回score值

 获取命令
       start stop 为元素的下标索引;
       索引从左侧开始,第一个元素为0;
       索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素,-2 表示倒数第二个元素; zrange key 0 -1:列出所有元素
       超出范围的下标并不会引起错误,只是简单地返回一个空列表;
       具有相同 score 值的成员按字典序的顺序(reverse lexicographical order)排列。
①zrange key start stop [WITHSCORES]:类似lrange操作,获取集合中指定范围内的元素。按score由小到大,返回有序结果
②zrevrange key start stop [WITHSCORES]:同上,返回结果是按score逆序排的。按score由大到小
       LIMIT 参数指定返回结果的数量及区间
       WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回
       min 和 max 可以是 -inf 和 +inf。zrangebyscore key -inf +inf 等价于 zrange key 0 -1
              zrangebyscore key -inf 5:返回所有符合条件 score <= 5 的成员
              zrangebyscore key (1 +inf:返回所有符合条件 score > 1 的成员
       默认情况下,区间的取值使用闭区间 (<=或>=),也可以使用( 符号,来使用可选的开区间 (小于或大于)
              zrangebyscore key 1 5返回所有符合条件 1 <= score <= 5 的成员
              zrangebyscore key 1 (5返回所有符合条件 1 < score <= 5 的成员
              zrangebyscore key (1 (5返回所有符合条件 1 < score < 5 的成员
       具有相同 score 值的成员按字典序(lexicographical order)来排列
③zrangebyscore key min max [WITHSCORES] [LIMIT offset count]:返回所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的元素。按 score 值递增(从小到大)。
④zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]:同上。按 score 值递减(从大到小)
⑤zrank key member:返回指定元素在集合中的排名(下标从0开始),集合中元素是按score从小到大排序的
⑥zrevrank key member:同上,但是集合中元素是按score从大到小排序
⑦zcount key min max:
返回score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
zscore key member:返回成员member对应的score
⑨zcard key:返回set集合中的元素个数

 删除命令
①zrem key member [member]:从key对应set中移除给定元素,成功返回1,若元素不存在返回0
②zremrangebyrank key min max:删除集合中排名在给定区间的元素

 

需求:手机APP下载排行榜,提高排行榜的位置

6、哈希hash(KV模式不变,但V是一个键值对,类似Java的Map)

是一个键值对集合。类似Java里面的Map<String,Object>
key-->value(field-->value)结构。适合存储json对应关系、pojo对象关系、关联数组等
在没有要求的情况下,建议使用hash结构,使用更方便,压缩率也更高

保存/修改命令
①hset key field value
:设置hash field为指定值。设置的键不存在为添加,若已存在,则为修改。
②hmset key field1 value1 field2 value2... fieldN valueN:批量设置
③hsetnx key field value:设置hash field为value,若域 field 已经存在,该操作无效。

获取命令
①hget key filed:获取指定hash的field
②hmget key field1 field2... fieldN:获取全部指定的hash field
③hkeys key
:返回指定hash的所有的field
④hvals key:返回指定hash的所有的value
⑤hgetall key:返回指定hash的所有field和value
⑥hlen key:返回指定hash的field数量
⑦hexists key field:测试指定field是否存在,存在返回1,不存在返回0

删除命令
①删除整个hash及值,使用key命令的del
hdel key field:删除指定hash的field,删除成功返回1,删除失败返回0

其他命令
hincrby key field integer:将指定hash的field加上增量integer
②hincrbyfloat key field increment
:将指定hash的field加上浮点数增量 increment

需求:把数据库的数据以hash的方式存储,下图:

四、优化操作

redis提供数据持久化机制(即数据存储到磁盘中)。
方式:①snappshoting快照。默认开启。文件dump.rdb
           ②append only file追加写方式,简称aof。文件
当我们stop或kill掉redis后再重启,发现原来的数据还能加载出来,这就是redis将数据存储到磁盘上了。当我们重新启动redis的时候,磁盘读取对应的数据备份文件,完成数据的加载。

1、snappshoting快照,默认开启

①查看配置文件快照默认备份频率
在下面的示例中,行为将是保存:              
#900秒(15分钟)后,如果至少更换了1个钥匙              
#300秒(5分钟)后,如果至少10个键发生变化              
#60秒后,如果至少10000个密钥更改


②测试备份频率,明显可以看到dump.rdb文件被更新了。满足快照机制,触发备份

③执行执行./redis-check-rdb ./dump.rdb    //linux     用来测试rdb文件是否有问题

④缺点:如果我在5分钟之内只写了9个key或者1分钟内没有写一万个key,没有满足触发条件,那么这些key就要丢失。当然我们可以选择修改redis.windows.conf文件,但是尽量不要修改。可以使用aof追加写方式。

2、append only file追加写 aof

默认不开启。开启时之前的快照数据会丢失。
①查看配置并开启

②备份频率
# appendfsync always  //每次收到写命令就立即强制写入磁盘。速度最慢,但保证完全的持久化。不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次。在性能和持久化方面做了很好的折中。推荐。
# appendfsync no //完全依赖操作系统OS。性能最好,持久化没保证。

③修改appendonly yes后重新启动redis服务,明显可以看到新生成了appendonly.aof文件,大小为0k

④测试备份频率,appendonly.aof文件大小发生变化

⑤执行redis-check-aof appendonly.aof用来测试aof文件是否有问题
执行./redis-check-aof ./appendonly.aof    //linux

3、测试redis的并发  redis-benchmark

执行 redis-benchmark -h 127.0.0.1 -p 6379 -n 100000 -c 20    //-n测多少次,-c并发测多少
执行./redis-benchmark -h 127.0.0.1 -p 6379 -n 100000 -c 20    //linux
连接远程redis,先ping  ip,看服务通不通。然后再看端口。
测试结果文档参考:redis学习之--测试redis的并发 redis-benchmark(三)

五、消息队列操作(结合代码)


实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值