zoukankan      html  css  js  c++  java
  • redis学习

    Redis

    NoSQL(not only SQL),非关系型数据库

    特点:

    • 通常是以key-value形式存储

    • 不支持SQL语句

    • 没有表结构

    优势:

    • 高并发读写

    • 大数据量的扩展

    • 配置简单

    • 灵活高效的操作与数据模型

    • 配置简单

    • 低廉的成本

    缺点:

    • 没有统一标准

    • 没有官方支持,并不成熟

     

    redis介绍

    1. 概述

    • Remote dictionary server(远程数据服务)的缩写

    • 由C语言编写,数据模型为key-value

    • 支持的value类型多,包括string,hash,list,set,zset

    • 数据都是缓存在内存中,可以周期性的把更新的数据写入磁盘或把修改操作写入追加的记录文件

    1. 特点

    • 高速读取数据

    • 减轻数据库负担

    • 有集合计算功能

    • 多种数据结构的支持

    1. 适合场景

    • 排行榜应用

    • 获得最近N个数据

    • 计数器应用

       

    • 支持大量数据类型

    • 原子性(要么成功执行,要么失败完全不执行)

    • 丰富的特性,支持publish/subscribe,通知,key,过期等特性

    和其他key-value存储的区别?

    • 有更加复杂的数据结构并且提供原子性操作

    • 运行在内存中并且持久到磁盘中

     

    登录方法

    1. 第一个cmd窗口,打开服务器端

    redis-server.exe redis.windows.conf
    1. 第二个cmd窗口,打开客户端

    redis-cli.exe -h 127.0.0.1 -p 6379
    1. 测试方法

    set myKey abc
    get myKey

     

     

    数据类型

    string,hash,list,set,zset(sorted set:有序集合)

    • string

    redis最基本的数据类型,可以包含任何数据,包括jpg或者序列化的对象。

    最大能存储512MB

    1. set

    设置键,值

    语法:set 键名称 值

    set name xiaobao
    1. get

    获取key对应的string值,如果key不存在返回 nil

    语法: get 键值

    get name
    1. incr

    对key的值做++操作,并返回新的值,每执行一次值加1,值类型应该为数据类型

    语法: incr key

    set num 1
    incr num
    1. incrby

    指定加多少

    语法:incrby 加的数

    incrby num 12
    • hash

    用来存储对应的mysql中一行的数据,类似于关联数组

    1. hset

    设置hash里面的field和value的值

    语法:hset 哈希的名称(键名称) field value

    hset huang id 1
    1. hget

    获取hash里面的field值

    语法:hget 哈希的名称 (键名称)field value

    get huang id
    
    1. hmset

    一次性设置多个field和value

    语法:hmset 哈希的名称 field1 value1 field2 value2 ...

    hmset hash_name  id 1 name huang
    
    1. hmget

    一次性获取多个field 的value

    语法:hmget 哈希的名称 field1 field2

    hmget hash_name id  name
    
    1. hgetall

    获取指定hash中所有的filed和value

    语法:hgetall 哈希的名称

    hgetall hash_name
    
    • 链表

    关键词list,是双向链表

    1. lpush

    从链表的头部添加元素

    语法: lpush 链表名称 (键的名称) 元素

    lpush list1 first
    
    1. lrange

    获取链表里面的元素

    链表里面的元素开始下标是0

    语法:lrange 链表的名称 开始下标 结束下标

    注意:

    如果开始下标是0,结束下标是-1,则为返回链表中所有的元素

    lrange list1 0 -1
    
    1. rpush

    从链表的尾部添加元素

    语法:rpush 链表的名称 (键的名称) 元素

    lpush list1 third
    
    1. ltrim

    保留指定范围的元素

    语法:ltrim 链表的名称 开始下标 结束下标

    ltrim list1 0 0
    
    1. lpop

    从链表的头部删除一个元素,返回删除的元素

    语法:lpop 链表的名称

    lpop list1
    
    • 集合(set)

    通过hash表来实现的

    redis的set是string类型的无序集合

    set元素最大可以包含(2 ^ 32 - 1)个元素

    可以实现基本的添加,删除,还有集合的并集,交集,差集。很容易实现好友推荐功能

    1. sadd

    向集合中添加元素

    语法:sadd 集合名(键名)元素名称

    sadd set1 first
    sadd set1 second
    sadd set1 3
    
    1. smembers

    获取集合中的元素

    语法:sembers 集合名

    smembers set1
    
    1. sdiff

    获取集合中的差集(在集合1中存在,但是不在集合2中存在的元素)

    语法:sdiff 集合1 集合2

    sadd set2 first
    sdiff set1 set2
    
    1. 获取交集

    语法:sinter 集合1 集合2

    sinter set1 set2
    
    1. 求并集

    两个集合合并之后,去掉重复的元素

    语法:sunion 集合1 集合2

    sunion set1 set2
    
    1. scard

    获取集合中元素的个数

    语法:scard 集合名称

    scard set1
    
    • zset

     

    sorted set是set的一个升级版本,在set的基础上增加了一个顺序属性,这个属性在添加修改元素的时候可以指定,每次指定之后,zset会自动按照新的值调整顺序,操作中的key理解为zset的名字

    1. zadd

    向有序集合中添加元素,如果该元素存在,就更新其顺序

    语法:zadd 集合名 序号 内容

    zadd zset1 10 xiao
    
    1. zrange

    把集合排序后,返回名词[start,stop]的元素

    默认是升序排列

    语法:zrange 集合名称 开始下标 结束下标

    zrange zset1 0 -1
    
    1. zrevrange

    按括号降序获取有序集合中的内容

    语法:zrevrange 集合名称 开始下标(索引) 结束下标(索引)

    zrevrange zset 0 -1
    

     

    Redis常用命令

    1. 键值相关的命令

    2. 服务器相关的命令

    • key

    返回当前数据库里面的键,可以使用通配符,*表示任意多个,? 表示任意一个字符

    • exists

    删除指定的键

    语法:del 键名称

    • expire

    设置键的有效期

    语法:expire key 有效期(秒数)

    expire name 60
    
    • ttl

    返回一个键剩余的过期日期

    语法:ttl 键名

    ttl name 
    
    • type

    返回数据类型

    语法: type key

    type name
    
    • select

    选择数据库,在redis里面中默认有0~15号数据库,默认是0号数据库

    可以通过redis.conf配置文件进行设置

    • flushdb

    清空当前数据库中所有的键

    • flushall

    清空所有数据库里面的所有的键

     

    持久化机制

    redis为了内存数据的安全考虑,会把内存中的数据以文件的形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存中

    数据保存到硬盘的过程就是 ‘ 持久化’ 效果

    redis支持两种持久化方式:

    1. snapshotting(快照)默认方式

    2. append-only file(缩写)的方式

     

    snaoshotting 快照方式持久化

    该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中(备份文件名字默认是dump.rdb) , 如果数据非常多(10~20G)就不适合频繁的进行该持久化操作

    1. 如何开启,默认开启是有自己的触发条件的

    save 900 1 900秒内如果超过一个key被修改,则发起快照保存
    
    1. 社会保存位置和备份的文件名

    备份文件名字默认是dump.rdb,我们也可以自己修改

    可以通过配置文件来完成修改

    1. 手动发起快照

    方法1:在登录状态,直接执行bgsave

    方法2:在没有登录状态

    ./redis-cli bgsave
    

    缺点:

    由于快照方式是在一定间隔做一次,所以如果redis以外down掉的话,会失去最后一个快照后的所有修改

     

    append-only-file 追加方式持久化AOF

    本质:把用户执行的每个 ‘写’ 指令(添加,修改,删除) 都备份到文件中,还原数据的时候就是执行具体写指令而已

    1. 开启方式

    打开redis.conf配置文件,进行打开配置

    appendonly yes //启用aof持久化方式
    appendfilename appendonly.aof // 保存命令的文件
    
    1. 触发条件

    # appendfsync always   //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
    appendfsync everysec   //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
    # appendfsync no   //完全依赖 os,性能最好,持久化没保证
    
    
    1. aof文件的重写

    把多个incr指令换为一个set指令

    问题 :每个命令重写一次aof,如果某个key操作100次,产生100行记录,aof文件会很大,怎么解决?

    答:对aof文件进行重写,比如把执行10次incr number 压缩成 set number 11

    语法:

    ./bin/redis/cli-a 密码 bgrewriteaof
    

     

     

  • 相关阅读:
    深拷贝浅拷贝
    计算属性和监听,computed,watch
    字面量的引用与使用
    MYSQL 触发器
    JavaScript寻找对象方式
    JavaScript事件传播
    HTML 绑定事件
    JavaScript 中的 String()方法
    JavScript re模块
    JavScript Math函数的使用方法
  • 原文地址:https://www.cnblogs.com/letlifestop/p/11546788.html
Copyright © 2011-2022 走看看