zoukankan      html  css  js  c++  java
  • redis

    Linux day10

    NoSQL no only sql

    简介

    在过去几年,关系型数据库一直是数据持久化的唯一选择,数据工作者考虑的也只是在这些传统数据库中做筛选,比如SQL Server、Oracle或者是MySQL。甚至是做一些默认的选择,比如使用.NET的一般会选择SQL Server;使用Java的可能会偏向Oracle,Ruby是MySQL,Python则是PostgreSQL或MySQL等等。

    原因很简单:过去很长一段时间内,关系数据库的健壮性已经在多数应用程序中得到证实。我们可以使用这些传统数据库良好的控制并发操作、事务等等。然而如果传统的关系型数据库一直这么可靠,那么还有NoSQL什么事?NoSQL之所以生存并得到发展,是因为它做到了传统关系型数据库做不到的事!

    为什么nosql会发展的这么好那?

    关键原因是:传统关系型数据库遇到了性能瓶颈。

    • High performance - 对数据库高并发读写的需求
    • Huge Storage - 对海量数据的高效率存储和访问的需求
    • High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求

    redis

    热点数据:经常被使用的数据,存储在内存中。

    官网:https://redis.io/download

    安装redis:
    方式一:
    yum安装,先配置epel-*
    yum install -y redis
    
    方式二编译安装:
    cd /opt
    wget http://download.redis.io/releases/redis-5.0.5.tar.gz
    tar xf redis-5.0.5
    ll
    cd /redis-5.0.5
    cat Readme
    make
    
    yum install -y tcl
    安装成功
    

    redis可执行文件

    ./src/redis- 	# 按tab
    redis-check-aof  #用于修复出问题的AOF文件
    redis-sentinel   #用于集群管理
    redis-check-rdb  #用于修复出问题的dump.rdb文件
    redis-server     #redis的服务端
    redis-benchmark  #性能测试
    redis-cli        #redis的客户端
    redis-trib.rb    #集群管理
    
    

    启动

    [root@localhost redis-5.0.5]#./src/redis-server
    
    # 查看端口:
    ss -tnlp 	6379
    

    性能测试

    # 默认是100000个,50个客户端同时发起连接
    [root@localhost redis-5.0.5]#./src/redis-benchmark -q
    PING_INLINE: 29682.40 requests per second
    PING_BULK: 29568.30 requests per second
    SET: 29120.56 requests per second
    GET: 32175.03 requests per second
    INCR: 30969.34 requests per second
    LPUSH: 29334.12 requests per second
    RPUSH: 30404.38 requests per second
    LPOP: 32351.99 requests per second
    RPOP: 30998.14 requests per second
    SADD: 31847.13 requests per second
    HSET: 32258.07 requests per second
    SPOP: 31938.68 requests per second
    LPUSH (needed to benchmark LRANGE): 32414.91 requests per second
    LRANGE_100 (first 100 elements): 13336.89 requests per second
    LRANGE_300 (first 300 elements): 5937.54 requests per second
    LRANGE_500 (first 450 elements): 4234.06 requests per second
    LRANGE_600 (first 600 elements): 3434.77 requests per second
    MSET (10 keys): 30084.24 requests per second
    
    

    连接

    [root@localhost redis-5.0.5]#./src/redis-cli -h
    -h # ip地址
    -p # 端口 6379
    -s # 套接字
    -a # 密码
    -n # 数据库数量   ./src/redis-cli -n 2	# 指定redis的库
    

    redis数据类型

    • string:字符串
    • hash:哈希
    • list:列表
    • set:集合
    • zset:有序集合
    类型 简介 特性 场景
    string 二进制安全 可以包含任何数据,比如jpg图片(二进制)或者序列化的对象,一个键最大能存储512M
    Hash(字典) 键值对集合 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值 存储、读取、修改用户属性
    List(列表) 链表(双向链表) 增删查,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
    Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
    Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列

    命令相关

    命令不区分大小写
    [root@localhost redis-5.0.5]#./src/redis-cli 
    127.0.0.1:6379> ping	# ping测试redis是否连接通,返回值是PONG
    PONG
    127.0.0.1:6379> info	# info 获取系统全部信息
    
    127.0.0.1:6379> INFO cpu	# INFO 获取cpu信息
    # CPU
    used_cpu_sys:83.807114
    used_cpu_user:121.747879
    used_cpu_sys_children:0.046584
    used_cpu_user_children:0.040134
    
    127.0.0.1:6379> ECHO anwen	# ECHO 打印内容
    "anwen"
    
    127.0.0.1:6379> quit	# quit 退出
    
    # redis分为16个库,从0-15
    127.0.0.1:6379> select 1 	# select 切换redis的库  1
    127.0.0.1:6379> set anwen 123
    127.0.0.1:6379> get anwen
    
    127.0.0.1:6379> select 2	# select 切换redis的库  1
    
    127.0.0.1:6379> SELECT 1
    OK
    127.0.0.1:6379[1]> set anwen aaa
    OK
    127.0.0.1:6379[1]> get anwen
    "aaa"
    127.0.0.1:6379[1]> del anwen	# 删除一个或者多个key,不存在的key会忽略
    (integer) 1
    
    
    127.0.0.1:6379[1]> EXISTS anwen	# 判断key是否存在,存在为1  不存在为0
    (integer) 0
    
    127.0.0.1:6379> EXPIRE anwen 3	# 设置存活时间活3秒 EXPIRE+key+seconds
    (integer) 0
    127.0.0.1:6379> get anwen	# EXPIRE 过期以后自动删除
    (nil)
    
    
    127.0.0.1:6379> set anwen 123
    OK
    127.0.0.1:6379> EXPIRE anwen 5	
    (integer) 1
    127.0.0.1:6379> ttl anwen	# 查看key的存活时间;-2key不存在,-1永久生效;
    (integer) 1
    127.0.0.1:6379> ttl anwen
    (integer) -2
    
    
    127.0.0.1:6379> KEYS *	# 查找所有符合的规则,支持通配符
    1) "mylist"
    2) "anwen"
    3) "key:__rand_int__"
    4) "counter:__rand_int__"
    5) "myset:__rand_int__"
    127.0.0.1:6379> keys a*
    1) "anwen"
    127.0.0.1:6379> keys a????
    1) "anwen"
    
    
    127.0.0.1:6379> move anwen 1	# move+key+db 移动当前的key 到指定的db里面,成功返回1,失败返回0
    (integer) 1
    127.0.0.1:6379> get anwen
    (nil)
    127.0.0.1:6379> SELECT 1
    OK
    127.0.0.1:6379[1]> get anwen
    "123"
    
    
    
    127.0.0.1:6379[1]> PEXPIRE anwen 10000	pexpire key # 给一个key设置过期时间
    (integer) 1
    127.0.0.1:6379[1]> pttl anwen	# pttl 查看key存活时间 单位是毫秒
    (integer) 2065
    127.0.0.1:6379[1]> pttl anwen
    (integer) -2
    
    
    127.0.0.1:6379[1]> RANDOMKEY	# RANDOMKEY随机获取一个key,不删除;如果数据库为空则返回空
    "anwen"
    127.0.0.1:6379[1]> RANDOMKEY
    "yage"
    
    
    127.0.0.1:6379[1]> RENAME anwen aw	# RENAME重命名,如果源key不存在,则报错,如果目标key存在,则覆盖
    OK
    127.0.0.1:6379[1]> keys *
    1) "yage"
    2) "aw"
    127.0.0.1:6379[1]> RENAME anwen anwen
    (error) ERR no such key
    
    127.0.0.1:6379[1]> RENAMENX anwen aw	#重命名key,如果源key不存在,则报错,如果目标key存在,则不变
    
    
    127.0.0.1:6379[1]> TYPE anwen	# TYPE 查看key所存储的数据类型;如果没有key则返回none
    string
    127.0.0.1:6379[1]> LPUSH anwenlist 1 2
    (integer) 2
    127.0.0.1:6379[1]> TYPE anwenlist
    list
    127.0.0.1:6379[1]> type aaa
    none
    
    

    string

    set     # 设置key - value,如果key存在则覆盖,不存在则新建
    set key1 v1 EX 5	# ex + seconds 设置key的存活时间
    set key value px 10000	# px + 毫秒 设置key的存活时间
    set key value NX # nx 如果键不存在则新建  如果键存在则返回nil
    set key value xx # xx 只有键存在才能操作,可以改值
    
    mset # 批量创建key - value对应关系
    mset k1 v1 k2 v2 k3 v3
    mset k1 vv1 k2 vv2 #key存在则覆盖
    
    get		# 获取key对应的value,只能获取一个,如果key存在则返回值,如果key不存在则nil
    mget k1 k2 k3 k4	# 批量获取key 
    
    getset k1 v1	# 给指定的key设置新value,并返回原来的旧value,如果key不存在则返回nil
    
    strlen anwen	# 返回key对应的value的长度
    
    append anwen 123	# 如果key存在则追加,如果key不存在则新建
    
    incr anwen	# 将key中存在的value 加1,只能对数字有效
    incrby anwen 10 # 将key中存在的value 加10  指定加的值
    incrbyfloat anwen 1.2 # 将key中存在的value 加指定的浮点值
    incrbyfloat anwen -1.2	# 减
    incrbyfloat anwen 1.000000000	# 不保留.0   默认保留17位
    
    
    decr anwen 	# 将key中存在的value 减1,只能对数字有效
    decrby anwen 5	# 将key中存在的value 减5 指定减的值
    
    getrange anwen 1 3 # 切片 同Python类似,不能使用步长
    
    

    list

    lpush anwenlist 123 234 345	# 将一个或者多个value插入列表头部
    lrange anwenlist 0 -1	# 查看列表指定元素  查看全部 0 -1
    
    lpop anwenlist	# 删除并返回列表key的头一个元素,先进后出
    
    rpush anwenlist 456 # 将一个或者多个value插入列表尾部(最后边),
    rpop anwenlist	# 删除尾部的value
    
    rpushx # 将value插入到key的尾部,key必须存在才可以
    lpushx # 将value插入到key的头部,key必须存在才可以
    
    lindex anwen 2	# 从表头开始,获取下标为index的value
    
    linsert anwen before 234 999	# 将value插入key指定的元素前或者后,如果value不存在则不操作
    linsert anwen after 234 999
    
    llen # 获取列表长度
    
    lrem anwen # 删除列表中的value,count>0 从表头往表尾方向查找删除;count=0 全部删除;count<0 从表尾往表头方向查找,删除指定个数
    
    lset anwen 3 aaaa # 替换指定的索引位置的value,如果索引超出范围则报错
    
    ltrim anwen 1 3	# 列表的切片,超出为空
    
    

    hash

    {'db':{'redis':"redis.conf",'mysql':'mysql.conf','nginx':'nginx.conf'}}
    
    hset bd redis redis.conf	#给hash增加key value
    hset bd mysql mysql.conf
    hset bd nginx nginx.conf
    
    hlen bd h	# 获取hash长度
    hget bd mysql	# 获取key的value
    hgetall db	# 获取所有的键值对
    
    hmset ac 1 2 2 3 3 4 4 5	# 批量增加键值对
    hlen ac
    hmget ac 1 3	# 批量获取键值对
        1) "2"
        2) "4"
    
    
    hsetnx ac 1 5	# 给指定的hash增加键值对,如果原来的键存在则操作无效,如果不存在则新增
    hsetnx
    
    hkeys ac # 获取hash表中所有的键
    
    hvals db # 获取hash表中所有的value
    
    hdel db redis	# 删除hash表中的一个或者多个key-value
    hkeys db
    
    hexists db mysql # 判断hash表中的键是否存在,如果存在则为1,不存在则为0
    
    hincrby	# 给hash表中的键增加指定的数值,仅限数字
    hincrbyfloat # 给hash表中的键增加指定的浮点值,仅限数字
    
    

    set

    sadd s22 dazhuagn dazhuang dazhuagn anwen # sadd给集合添加值,自动去重
    smembers s22	# 获取集合所有值成员
    
    scard s22 # 获取集合中成员个数
    
    sadd s23 anwen biaoge
    sdiff s22 s23	# 获取两个集合的差集,前面存在但是后面不存在
    sinter s22 s23	# 获取两个集合的交集
    sunion s22 s23  # 获取两个集合的并集
    
    sismember s22 anwen # 判断元素是否在集合中,如果存在则为1,不存在则为0 
    smove s22 s23 anwen	# 将指定的元素从一个集合移动到另一个集合,如果原集合存在则移动,如果不存在则忽略;如果目标集合存在则直接移动,如果目标不存在则新建集合并移动
    
    spop s22 2	# 随机删除指定个数的元素,并打印删除的元素
    
    srandmember s22 2	# 随机获取指定个数的元素,默认随机获取一个
    count>0 :
    	如果count大于集合总数则全取
    	如果count小于集合总数则随机取指定个数
    count<0 :则随机取指定个数
    
    srem s22 anwen	# 删除指定的一个或多个元素
    
    

    zset

    zadd 123 1 123
    zrange 123
    
    
  • 相关阅读:
    gitlab: git clone/pull / push: The project you were looking for could not be found
    转载: MySQL启动出错InnoDB: Check that you do not already have another mysqld process解决方法
    root用户删除文件,提示:Operation not permitted
    使用dockerfile打包新镜像
    kubernets创建Deployment
    代理全家福
    Spring事务传播详解
    [FFmpeg]Centos7 yum安装
    [Redis]存放字典
    [Docker]开放2375端口
  • 原文地址:https://www.cnblogs.com/an-wen/p/12052410.html
Copyright © 2011-2022 走看看