redis 系列(一)- redis的入门与安装

  • redis 是什么

redis是缓存数据库(key-value类型),和关系数据库(比如mysql)不同的是,redis的数据都是放在内存中,而不是硬盘里,虽然redis也有用到硬盘,但只是作为持久化。

  • 为什么要用redis

  1. 快,因为redis存放在内存中,所以相比mysql,访问起来要快很多。
  2. 除了做缓存用以外,redis还可以用作排行榜,简单的消息队列,session,计算器,共同好友等
  • redis和mysql的区别

  1. redis的数据主要存放在内存中,而mysql主要存放在硬盘里,所以redis查起数据要比mysql快很多
  2. redis采用的是key-value的存储方式,而mysql采用的是关系表的存储方式;对于redis而言,我们只能根据key找到它的value,而不能像mysql那样子,select * from XXX where colunm = xx
  • redis的总数据结构

redis是一个key-value类型的数据库,key一般指字符串,而value可以分为很多数据结构,比如string,bytes,set, list,hash,zset,bitmap等。

我们可以把redis看做是一张大的哈希表,因此学习redis的时候我们可以类比Java中的HashMap。



在Redis中,hash表被称为字典(dictionary),采用了典型的链式解决冲突方法,即:当有多个key/value的key的映射值(每对key/value保存之前,会先通过类似HASH(key) MOD N的方法计算一个值,以便确定其对应的hash table的位置)相同时,会将这些value以单链表的形式保存;同时为了控制哈希表所占内存大小,redis采用了双哈希表(ht[2])结构,并逐步扩大哈希表容量(桶的大小)的策略,即:刚开始,哈希表ht[0]的桶大小为4,哈希表ht[1]的桶大小为0,待冲突严重(redis有一定的判断条件)后,ht[1]中桶的大小增为ht[0]的两倍,并逐步(注意这个词:”逐步”)将哈希表ht[0]中元素迁移(称为“再次Hash”)到ht[1],待ht[0]中所有元素全部迁移到ht[1]后,再将ht[1]交给ht[0](这里仅仅是C语言地址交换),之后重复上面的过程。

  • 单线程

redis采用单线程架构和IO多路复用模型来实现高性能,多个客户端访问redis,redis会按照接收顺序把命令存放到一个队列里面,然后再按先到先得的顺序依次一个一个的执行这些命令。

单线程为什么还那么快
  1. 基于内存的查询,不涉及硬盘IO
  2. 数据结构简单,对数据操作也简单
  3. 使用多路I/O复用模型,非阻塞IO
  4. 多线程主要用于对cpu耗时比较高的操作,但是redis的每个CPU操作都比较简单,不存在CPU瓶颈,所以没有必要采用多线程
单线程的好处
  1. 代码简单
  2. 避免加锁
  3. 避免上下文切换
  • redis的value的数据结构

一 字符串 STRING

字符串是redis最基本的数据结构,其实value的值不止可以是字符串,还可以是复杂字符串(比如json),或者数字,二进制(比如把一个对象序列化),但是它的大小不能超过512M。

常用命令

  1. 设置值
    set key value [ex seconds] [px milliseconds] [nx | xx]

ex seconds 设置有效期 以秒为单位
px milliseconds 设置有效期 以毫秒为单位
nx 只有键值不存在,才能设置成功,否则返回失败
xx 只有键值存在,才能设置成功,否则返回失败

  1. 获取值
    get key
  2. 批量
    mget key1 key2 mset key1 value1 key2 value2
  3. 计数
    incr key 自增
    decr key 自减
    incrby key increment 自增一个值
    decrby key decrement 自减一个值

典型使用场景

  1. 利用 setnx key value 可用来开发分布式锁
  2. 可用于对象缓存,如session共享
  3. 计数器
二 哈希表 HASH

对于对象,比如一个user,user有name,age等字段;如果用string作为数据结构来存储user(转成json),这样子,我们修改name的时候,要把整个user拿出来,然后再修改name字段,即使我们不需要修改age字段;如果用哈希表的话(跟我们Java中的map极为相似),我们只需要修改name字段即可。

常用命令

  1. 设置值
    hset key field value
  2. 获取值
    hget key field 获取某个字段的值
    hkeys key 获取key的所有字段
    hlen key 获取key中字段的个数
三 列表 LIST

list(列表),用来存储多个有序的字符串,每个列表一共可以存储2^32 -1个元素。



redis中列表类似于上图的一个东西;lpush为向左添加元素,rpush为向右添加元素,lpop为向左取出元素,rpop为向右取出元素;如果我们想要队列(先进先出的效果),我们可以lpush+rpop/rpush+lpop;如果我们想要栈的效果,我们可以lpush + lpop/rpush + rpop。可以用llen来获取列表的长度。

使用场景

  1. 队列和栈
  2. 消息队列
四 集合 SET

set(集合),用以保存多个不重复元素的集合,相当于Java的set。

常用命令

  1. 添加元素
    sadd key value
  2. 删除元素
    srem key value

集合操作

  1. 求两个集合的共同元素
    sinter key1 key2
  2. 求两个集合的和
    sunion key1 key2
  3. 求两个集合的不同元素
    sdiff key1 key2 这里是指key1集合除1去和key2相同元素以外,还剩下什么元素

使用场景

  1. 利用sinter,可以做到和朋友圈相同的效果,即只能看到共同好友的评论。
五 有序集合 ZSET

有序集合常用于排行榜。由图可以看出,它的每个元素分为两个字段,一个score,一个member,member我们可以对应排行榜里面的某个人,score可以对应这个人的分数。说它有序,不是说元素按先到先得排序,而是说元素按照score的大小排序。

跳表

实现元素可以按大小排序的数据结构有很多种,比较复杂的有红黑树等,而简单的也有普通的链表,在ZSet中,它是根据跳表来实现的。为什么redis要用跳表来实现zset呢?因为红黑树太复杂,每次增删耗时较大;普通链表又太简单,查询效率比较低;跳表就是为了弥补普通链表查询效率较低而开发的。

普通的链表的每个元素有且只有一个指向下一个元素的指针,但是在跳表中的每个元素可能有1-32个指针指向不同的下一个元素。比如下面:



元素 3 可能只有一个指针,但是元素7吧4个指针,元素19有2个指针。
为什么跳表的查询效率要比普通链表高呢? 先看看跳表是怎么查数据的,比如我们要查23这个元素,首节点最高层的指针找到了7这个节点,然后7的最高层指针找不到元素了,所以换回第二高的指针,这次找到37这个元素,但是因为37比23大,所以重新返回7元素,换回倒数第三高的指针,这次找到19,19比23要小,所以从19最高层指针找到37元素,37比23大,返回,以此类推,最后在最底层指针找到23位于22和26之间。

  • Linux安装redis

  1. 先查询Linux是否安装了GCC,因为redis是用c写的,需要GCC做c的编译器
    gcc -v 查询是否安装
    yum install gcc 安装gcc
  2. 下载redis
    wget wget http://download.redis.io/releases/redis-3.2.6.tar.gz
  3. 解压
    tar -zxvf redis-3.2.6.tar.gz
  4. 进入redis主目录
    cd redis-3.2.6
  5. 编译
    make
    如果编译失败需要把主目录删掉重新解压
  6. 安装
    cd src & make install
  7. 运行redis服务器
    ./src/redis-server redis.conf
    这里运行了服务器以后会发现redis只在前台运行,一旦Ctrl+c或者退出Linux,redis程序就会消失,我们需要修改redis.conf 里面的daemonize no 改为 daemonize yes
  8. 运行redis客户端
    ./src/redis-cli -p 6379
    ./src/redis-cli [-h host] [-p port] [-a passport]
    这里host表示主机ip,port表示端口,passport表示密码;新安装的redis一般都是用的6379的端口,我们可以在redis.conf里面修改端口。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 6,120评论 1 5
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,958评论 2 27
  • 本文为笔者对在学习Redis过程中所收集资料的一个总结,目的是为了以后方便回顾相关的知识,大部分为非原创内容。特此...
    EakonZhao阅读 14,407评论 0 9
  • 拎起扳手 我是一名车辆检修工 挥洒汗水,谨慎作业 保障着市民们的安全出行 拿起笔杆 我是一位内容创作者 绞尽脑汁,...
    西春阅读 209评论 9 14
  • 最近我开始阅读桑德尔的著作《公正》,看到里边讨论一个事例:假设你是一辆有轨电车的司机,电车以每小时60英里的速度沿...
    做个复杂人阅读 2,772评论 0 2