一、Redis介绍

1,redis介绍(Redis安装在磁盘;Redis数据存储在内存)

  

redis是一种基于键值对(key-value)数据库,其中value可以为string、hash、list、set、zset等多种数据结构,可以满足很多应用场景。还提供了键过期,发布订阅,事务,流水线,等附加功能,

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

1,特性:

1〉速度快,数据放在内存中,官方给出的读写性能10万/S,与机器性能也有关

a,数据放内存中是速度快的主要原因

b,C语言实现,与操作系统距离近

c,使用了单线程架构,预防多线程可能产生的竞争问题

2〉键值对的数据结构服务器

3〉丰富的功能:见上功能

4〉简单稳定:单线程

5〉持久化:发生断电或机器故障,数据可能会丢失,持久化到硬盘

6〉主从复制:实现多个相同数据的redis副本

8〉高可用和分布式:哨兵机制实现高可用,保证redis节点故障发现和自动转移

9〉客户端语言多:java php python c c++ nodejs等

2,使用场景:

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

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

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

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

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

二、正确安装与启动

1,linux上安装,windows也能装,但我们以linux环境为主

-------------------------------

2,配置、启动、操作、关闭

可执行文件

作用

redis-server

启动redis

redis-cli

redis命令行客户端

redis-benchmark

基准测试工具

redis-check-aof

AOF持久化文件检测和修复工具

redis-check-dump

RDB持久化文件检测和修复工具

redis-sentinel

启动哨兵

3,redis-server启动:

1,默认配置:redis-server, 日志输出版本信息,端口6379

2,运行启动:redis-server --port 6380  不建议

3,配置文件启动: redis-server /opt/redis/redis.conf,灵活,生产环境使用这种

4,redis-cli 启动

1,>交互式:redis-cli -h {host} -p {prot}连接到redis服务,没有h默认连127.0

redis-cli -h 127.0.0.1 -p 6379                //没有p 默认连6379

2,>命令式:redis-cli -h 127.0.0.1 -p 6379 get hello  //取key=hello的value

3,>停止redis服务: redis-cli shutdown

注意:  a,关闭时:断开连接,持久化文件生成,相对安

b,还可以用kill关闭,此方式不会做持久化,还会造成缓冲区非法关闭,可能会造成AOF和丢失数据

4,>重大版本:

1,版本号第二位为奇数,为非稳定版本(2.7、2.9、3.1)

2,第二为偶数,为稳定版本(2.6、2.8、3.0)

3,当前奇数版本是下一个稳定版本的开发版本,如2.9是3.0的开发版本

三、常用命令

1>Redis基本通讯模型

列举例子:三个客户端同时执行命令

客户端1:set name test

客户端2:incr num

客户端3:incr num

  

1>数据结构-字符串<String>

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

2.2,设值命令:set age 23 ex 10 //10秒后过期  px 10000 毫秒过期

setnx name test  //不存在键name时,返回1设置成功;存在的话失败0

set age 25 xx    //存在键age时,返回1成功

场景:如果有多客户同时执行setnx,只有一个能设置成功,可做分布式锁

获值命令:get age //存在则返回value, 不存在返回nil

批量设值:mset country china city beijing

批量获取:mget country city address //返回china  beigjin, address为nil

若没有mget命令,则要执行n次get命令

2.3,计数:incr age //必须为整数自加1,非整数返回错误,无age键从0自增返回1

decr age //整数age减1

incrby age 2 //整数age+2

decrby age 2//整数age -2

incrbyfloat score 1.1 //浮点型score+1.1

2.4,append追加指令:set name hello; append name world //追加后成helloworld

2.5,字符串长度:set hello “世界”;strlen hello//结果6,每个中文占3个字节

2.6,截取字符串:set name helloworld ; getrange name 2 4//返回 llo

2>数据结构-哈希hash

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

以上图的指令分别为:

set user:1:name   james

set user:1:age     18

不难发现,用字符串类型可以存储,但会过多占用KEY,浪费内存;

可以使用hash类型存储; hmset  user:1  name james  age  18;

3.1命令  hset key field value

设值:hset user:1 name james         //成功返回1,失败返回0

取值:hget user:1 name              //返回james

删值:hdel user:1 age               //返回删除的个数

计算个数:hset user:1 name james; hset user:1 age 23;

hlen user:1               //返回2,user:1有两个属性值

批量设值:hmset user:2 name james age 23 sex boy //返回OK

批量取值:hmget user:2 name age sex   //返回三行:james 23 boy

判断field是否存在:hexists user:2 name //若存在返回1,不存在返回0

获取所有field: hkeys user:2            // 返回name age sex三个field

获取user:2所有value:hvals user:2     // 返回james 23 boy

获取user:2所有field与value:hgetall user:2 //name age sex james 23 boy值

增加1:hincrby user:2 age 1      //age+1

hincrbyfloat user:2 age 2   //浮点型加2

3.2应用场景:

比如将关系型数据表转成redis存储:

三种方案实现用户信息存储优缺点:

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

set user:1:age  23;

set user:1:sex boy;

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

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

1,将对象序列化存入redis

set user:1 serialize(userInfo);

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

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

2,使用hash类型:

hmset user:1 name james age 23 sex boy

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

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

总结:对于更新不多的情况下,可以使用序列化,对于VALUE值不大于64字节可以使用hash类型

3>数据结构-列表<list>

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

添加命令:rpush james c b a //从右向左插入cba, 返回值3

lrange james 0 -1 //从左到右获取列表所有元素 返回 c b a

lpush key c b a //从左向右插入cba

linsert james before b teacher //在b之前插入teacher, after为之后,使                          用lrange james 0 -1 查看:c teacher b a

查找命令: lrange key start end //索引下标特点:从左到右为0到N-1

lindex james -1 //返回最右末尾a,-2返回b

llen james    //返回当前列表长度

lpop james   //把最左边的第一个元素c删除

rpop james   //把最右边的元素a删除

lrem key count value//删除指定元素

如:lpush test b b b b b j x z //键test放入z x j b b b b b

lrange test 0 -1 //查询结果为 z x j b b b b b

lrem test 4 b  //从左右开始删除b的元素,删除4个,

若lrem test 8 b, 删除8个b, 但只有5个全部删除

lrange test 0 -1 //删除后的结果为 b j x z

lrem test 0 b  //检索所有b全部删除 j x z

lpush user b b b b b j x z //键user从左到右放入 z x j b b b b b

ltrim user 1 3  //只保留从第2到第4的元素,其它全删

lrange user 0 -1 //查询结果为 x j b, 其它已全被删掉

lpush user01 z y x //键user01从左到右放入x y z

lset user01 2 java // 把第3个元素z替换成java

lrange user01 0 -1 //查询结果为 x y java

4>数据结构-集合<SET>

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

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

命令:

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,计算元素个数

sismember user a //判断元素是否在集合存在,存在返回1,不存在0

srandmember user 2 //随机返回2个元素,2为元素个数

spop user 2        //随机返回2个元素a b,并将a b从集合中删除

smember user   //此时已没有a b, 只有c

集合的交集:

sadd user:1 zhangsan 24 girl

sadd user:2 james 24 boy//初始化两个集合

sinter user:1 user:2     //求两集合交集, 此时返回24

sadd user:3 wang 24 girl //新增第三个元素

sinter user:1 user:2 user:3 //求三个集合的交集,此时返回24

使用场景:

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

使用方式:

给用户添加标签:

sadd user:1:fav basball fball pq

sadd user:2:fav basball fball

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

或给标签添加用户

sadd basball:users user:1 user:3

sadd fball:users user:1 user:2 user:3

........

计算出共同感兴趣的人:

sinter user:1:fav user2:fav

规则:sadd (常用于标签)  spop/srandmember(随机,比如抽奖)

sadd+sinter (用于社交,查询共同爱好的人,匹配)

5>数据结构-有序集合:

常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数

与集合有联系,不能有重复的成员

命令

zadd key score member [score member......]

zadd user:zan 200 james //james的点赞数1, 返回操作成功的条数1

zadd user:zan 200 james 120 mike 100 lee// 返回3

zadd test:1 nx 100 james   //键test:1必须不存在,主用于添加

zadd test:1 xx incr 200 james   //键test:1必须存在,主用于修改,此时为300

zadd test:1 xx ch incr -299 james //返回操作结果1,300-299=1

zrange test:1 0 -1 withscores  //查看点赞(分数)与成员名

zcard test:1     //计算成员个数, 返回1

查点赞数

zadd test:2 nx 100 james //新增一个集合

zscore test:2 james     //查看james的点赞数(分数),返回100

排名:

zadd user:3 200 james 120 mike 100 lee//先插入数据

zrange user:3 0 -1 withscores //查看分数与成员

返回指定分数范围的成员

zrangebyscore user:4 110 300 withscores //返回120 lee ,200 James, 由低到高

zrevrangebyscore user:4 300 110 withscores //返回200james 120lee,由高到低

zrangebyscore user:4 (110 +inf withscores//110到无限大,120mike 200james

zrevrangebyscore user:4 (110 -inf withscores//无限小到110,返回100 lee

返回指定分数范围的成员个数:

zcount user:4 110 300  //返回2,由mike120和james200两条数据

删除指定排名内的升序元素:

zremrangebyrank user:4 0 1 //分数升序排列,删除第0个与第1个,只剩james

删除指定分数范围的成员

zadd user:5 200 james 120 mike 100 lee//先插入测试数据

zremrangebyscore user:5 100 300     //删除分数在100与300范围的成员

zremrangebyscore user:5 (100 +inf    //删除分数大于100(不包括100),还剩lee

有序集合交集:

格式:zinterstore destination numkeys key ... [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

destination:交集产生新的元素存储键名称

numkeys:  要做交集计算的键个数

key :元素键值

weights:每个被选中的键对应值乘weight, 默认为1

初始化数据:

zadd user:7 1 james 2 mike 4 jack 5 kate      //初始化user:7数据

zadd user:8 3 james 4 mike 4 lucy 2 lee  6 jim  //初始化user:8数据

交集例子:

zinterstore user_jj 2 user:7 user:8 aggregate sum //2代表键合并个数,

//aggregate sum可加也不可加上,因为默认是sum

//结果user_jj:4james(1+3), 6mike(2+4)

zinterstore user_jjmax 2 user:7 user:8 aggregate max 或min

//取交集最大的分数,返回结果 3james  4mike, min取最小

使用场景:

排行榜系统,如视频网站需要对用户上传的视频做排行榜

点赞数:zadd user:1:20180106 3 mike  //mike获得3个赞

再获一赞:zincrby user:1:20180106 1 mike  //在3的基础上加1

用户作弊,将用户从排行榜删掉:zrem user:1:20180106 mike

展示赞数最多的5个用户:

zadd user:4:20160101 9 jack 10 jj 11 dd 3 james 4 lee 6 mark 7 kate

zrevrangebylex user:4:20160101 + - limit 0 5

查看用户赞数与排名:

zscore user:1:20180106 mike   zrank user:1:20180106 mike

浅谈Redis的基本原理和数据类型结构的特性和应用开发场景的更多相关文章

  1. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  2. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  3. 浅谈Redis五个对象类型的底层原理

    本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html Redis是一种key/value型数据库,其 ...

  4. 浅谈redis和memcached的区别

    缓存技术方面说到redis大家必然会联想到memcached,了解它们的人应该都知道以下几点吧 redis与 memcached相比,redis支持key-value数据类型,同事支持list.set ...

  5. 浅谈Redis数据库的键值设计(转)

    丰富的数据结构使得redis的设计非常的有趣.不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与.redis的DBA需要熟悉 ...

  6. 浅谈REDIS数据库的键值设计(转)

    add by zhj: 关系数据库表的一条记录可以映射成Redis中的一个hash类型,其实数据库记录本来就是键值对.这样,要比本文中的键设计用更少的键,更节省内存,因为每个键除了它的键值占用内存外, ...

  7. 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    很多小伙伴没接触过Redis,以至于去学习的时候感觉云里雾里的,就有一种:教程随你出,懂了算我输的感觉. 每次听圈内人在谈论的时候总是插不上话,小编就偷偷去了解了一下,也算是初入门径. 然后就整理了一 ...

  8. 浅谈Redis及其安装配置

    一.Redis的介绍 二.Redis的安装配置 三.Redis的配置文件说明 四.Redis的简单操作 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型. ...

  9. 听雷哥浅谈Redis

    Linux下安装redis 1.下载源码,解压缩后编译源码. $ wget http://download.redis.io/releases/redis-2.8.3.tar.gz $ tar xzf ...

随机推荐

  1. 荣获“5G MEC优秀商用案例奖”,阿里云边缘计算发力新零售

    4月24日,在中国联通合作伙伴大会的 “5G MEC(Mobile Edge Computing,移动边缘计算)边缘云赋能行业数字化转型”分论坛上,阿里云“基于5G边缘计算的新零售应用案例”荣获201 ...

  2. oracle函数 end

    [功能]当:<表达式>=<表达式条件值1……n> 时,返回对应 <满足条件时返回值1……n> 当<表达式条件值1……n>不为条件表达式时,与函数deco ...

  3. oracle WHERE子句中的连接顺序

    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 例如: (低效,执行时间1 ...

  4. oracle 识别’低效执行’的SQL语句

    用下列SQL工具找出低效SQL: SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_ ...

  5. iptables智能DNS

    1. echo 1 > /proc/sys/net/ipv4/ip_forward 2. 在NAT服务器上添加以下规则: 在PREROUTING链中添加目的地址转换规则: iptables -t ...

  6. ubuntu netstat 查看端口占用情况

    netstat 用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships ...

  7. torch.optim优化算法理解之optim.Adam()

    torch.optim是一个实现了多种优化算法的包,大多数通用的方法都已支持,提供了丰富的接口调用,未来更多精炼的优化算法也将整合进来. 为了使用torch.optim,需先构造一个优化器对象Opti ...

  8. supersockets单个 listener

    在下面的配置中,你可以配置服务器的监听 ip/port: <superSocket> <servers> <server name="TelnetServer& ...

  9. 深入Java线程管理(五):线程池

    这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧. 线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者 ...

  10. 2003年NOIP普及组复赛题解

    题目涉及算法: 乒乓球:简单字符串模拟: 数字游戏:区间DP: 栈:卡特兰数 麦森数:高精度.快速幂.数学. 乒乓球 题目链接:https://www.luogu.org/problem/P1042 ...