刨根问底Redis一-Redis入门

394 阅读6分钟

一、Redis入门

1.1 redis简介

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API其中value 可以为string、hash、list、set、zset 等多种数据结构,可以满足很多应用场景。还提供了键过期,发布订阅,事务,流水线,等附加功能

流水线

Redis 的流水线功能允许客户端一次将多个命令请求发送给服务器,并将被执行的多个命令请求的结果在一个命令回复中全部返回给客户端,使用这个功能可以有效地减少客户端在执行多个命令时需要与服务器进行通信的次数。

数据存放

1,Redis安装在磁盘;

2,Redis数据存储在内存

redis简单使用

比如说,数据库有一张表Order订单表, 表主键orderid

1.2 Redis特性

  1. 速度快,数据放在内存中,官方给出的读写性能10 万/S,与机器性能也有关
  2. 键值对的数据结构服务器
  3. 丰富的功能:见上功能
  4. 简单稳定:单线程
  5. 持久化:发生断电或机器故障,数据可能会丢失,持久化到硬盘
  6. 主从复制:实现多个相同数据的redis 副本
  7. 高可用和分布式:哨兵机制实现高可用,保证redis 节点故障发现和自动转移
  8. 客户端语言多:java php python c c++ nodejs 等

1.3 redis性能高性能原因

  1. 纯内存访问
  2.  非阻塞I/O(使用多路复用)
  3. 单线程避免线程切

1.3 redis使用场景

1,缓存:合理使用缓存加快数据访问速度,降低后端数据源压力

2,排行榜:按照热度排名,按照发布时间排行,主要用到列表和有序集合

3,计数器应用:视频网站播放数,网站浏览数,使用redis 计数

4,社交网络:赞、踩、粉丝、下拉刷新

5,消息队列:发布和订阅

1.4 redis基本操作

  可执行文件  作用
  redis-server  启动redis
  redis -cli  redis命令行客户端
  redis-benchmark  基准测试工具
  redis-check-aof  AOF持久化文件检测和修复工具
  redis-check-dump  RDB持久化文件检测和修复工具
  redis-sentinel  启动哨兵
redis-trib  cluster集群构建工具

二、Redis数据结构介绍

2.1 字符串

字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB

命令备注
set age 23 ex 1010秒后过期  px 10000 毫秒过期
setnx name test 不存在键name时,返回1设置成功;存在的话失败0
set age 25 xx  存在键age时,返回1成功
get age 存在则返回value, 不存在返回nil
set country china city beijing批量设值
mget country city address  批量获取

注意:若没有 mget 命令,则要执行 n get 命令

命令备注
incr age    必须为整数自加1,非整数返回错误,无age键从0自增返回1
decr age  整数age减1
incrby age 2整数age+2
decrby age 2整数age -2
ncrbyfloat score 1.1浮点型score+1.1
append name world追加指令
getrange name 2 4截取字符串

2.2 哈希 (Hash)

2.2.1 hash存储对象

redis得hash和JAVA的hash结构是一样的,我们可以将一些数据库的热点数据写入redis中。例如:

1,用户表数据如下:

2,存储到Redis, 使用字符串如何完成存储操作?

3,哈希hash是一个string类型的field和value的映射表,hash特适合用于存储对象

操作指令:  hmset user:1 name Dk age 18

2.2.2 hash常用命令

命令备注
hset key field value hset user:1 name Dk//成功返回1,失败返回0
hget user:1 name取值
hdel user:1 age 删只值
hlen user:1 计算个数
hmset user:2 name Dk age 23 sex boy批量设值
hmget user:2 name age sex批量取值
hexists user:2 name判断field是否存在
hkeys user:2获取所有field
hvals user:2批量取值
hgetall user:2获取user:2所有field与value
hincrby user:2 age 1 增加1
hincrbyfloat user:2 age 2增加2 浮点

2.2.3 hash对象存放优点

1,原生:set user:1:name Dk;

               set user:1:age  23;

               set user:1:sex boy;

      优点:简单直观,每个键对应一个值

      缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境

2,将对象序列化存入redis

      set user:1 serialize(userInfo);

      优点:编程简单,若使用序列化合理内存使用率高

      缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis

3,使用hash类型

        hmset user:1 name Dk age 23 sex boy

   优点:简单直观,使用合理可减少内存空间消耗

   缺点:要控制ziplist与hashtable两种编码转换,且hashtable会消耗更多内存erialize(userInfo);

2.2.4 内部编码

hash的内部编码主要有ziplist<压缩列表>和hashtable<哈希表>两种,大家感兴趣的话后面可以单独个章节介绍下这两种数据结构

 当field 个数少且没有大的value 时,内部编码为ziplist

如:hmset user:3 name Dk age 24; object encoding user:3 //返回ziplist

当value 大于64 字节,内部编码由ziplist 变成hashtable

如:hset user:4 address “fsgst64 字节”; object encoding user:3 //返回hashtable

2.3 列表

2.3.1 list简介

用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素

因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复

2.3.2 list常用命令

命令备注
rpush Dk c b a从右向左插入cba, 返回值3
lrange Dk 0 -1 从左到右获取列表所有元素 返回 c b a
lpush key c b a从左向右插入cba
linsert Dk before b teacher在b之前插入teacher, after为之后,使用lrange Dk 0 -1 查看
lrange key start end索引下标特点:从左到右为0到N-1
lindex Dk -1返回最右末尾a,-2返回b
llen Dk 返回当前列表长度
lpop Dk把最左边的第一个元素c删除
rpop Dk把最右边的元素a删除

2.4 集合

2.4.1 集合应用场景

用户标签,社交,查询有共同兴趣爱好的人,智能推荐

保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集;

2.4.2 set 命令:

命令备注
exists user检查user键值是否存在
sadd user a b c向user插入3个元素,返回3
sadd user a b若再加入相同的元素,则重复无效,返回0
smember user获取user的所有元素,返回结果无序
srem user a 返回1,删除a元素
scard user 返回2,计算元素个数

2.4.3 使用示例

当我们要根据用户标签筛选有同兴趣爱好的人,实现智能推荐,可以按照这种方式进行计算

1、给用户添加标签:

  sadd user:1:fav basball fball pq

  sadd user:2:fav basball fball  

  ............

2、或者标签添加用户

  sadd basball:users user:1 user:2

  sadd fball:users user:1 user:2

  .......

3、计算出共同感兴趣的人:

  sinter user:1:fav user2:fav

2.5 有序集合( ZSET

2.5.1 常用场景

常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数。与集合有联系,不能有重复的成员

三、redis常用命令

3.1 常用命令

   1,查看所有键:

             keys *   set school enjoy   set hello world

              keys *ool   ----->   school

   2,键总数 :

             dbsize         //2个键,如果存在大量键,线上禁止使用此指令

   3,检查键是否存在:

             exists key    //存在返回1,不存在返回0

   4,键过期:

             expire key seconds        //set name test  expire name 10,表示10秒过期

               ttl key                            // 查看剩余的过期时间

  5,键的数据结构类型:

             type key                        //返回string,键不存在返回none

3.2  redis数据库管理

redis 数据库管理方式
select 0   选择数据库
flushdb   清除数据库
flushall  清除所有数据
dbsize  数据大小

默认支持16个数据库;可以理解为一个命名空间

跟关系型数据库不一样的点

  1. redis不支持自定义数据库名词
  2. 每个数据库不能单独设置授权
  3. 每个数据库之间并不是完全隔离的。 可以通过flushall命令清空redis实例面的所有数据库中的数据

通过  select dbid 去选择不同的数据库命名空间 。 dbid的取值范围默认是0 -15