满天星
Fork me on GitHub

Redis学习笔记01

Redis是什么?
REmote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统。

优点:
能支持超过100K+每秒的读写频率。

安装:
实验楼(省略)
使用:
Sudo service reds-server start
redis-cli
>set mykey somevalue
>get mykey
可以用set和get来创建和检索strings

可以对已有的key重新赋值:
>set mykey newval nx
>set mykey newval xx

加法器:
>set counter 100
>incr counter。 加1
>incr counter
>incrby counter 50.  加50

使用mset和mget完成一次性多个key-value对应关系:
>mset a 10 b 20 c 30
>mget a b c

Push一类命令返回值为list的长度:
>rpush mylist A
>rpush mylist B
>lpush mylist first
>lrange mylist 0 -1
rpush为添加xx元素
Lrange里面的0表示list开头第一个,-1表示list倒数第一个,lrange为查看list元素

>rpush mylist 1 2 3 4 5 “foo bar”
>lrange mylist 0 -1

pop命令:
>del mylist
>rpush mylist a b c.  
>rpop mylist   取出mylist最右边的元素
>lrange mylist 0 -1
>lpop mylist 
>lrange mylist 0 -1

redis hashes存储:
>hmset user:1000 username antirez birthyear 1977 verified 1
>hget user:1000 username
>hget user:1000 birthyear
>hgetall user:1000

>hmget user:1000 username birthyear no-such-vield

hash加法:

>hincrby user:1000 birthyear 10

sadd命令产生一个无序集合,返回集合元素个数,smembers用于查看集合
>sadd myset 1 2 3
>smembers myset

sismember用于查看集合是否存在以及元素是否存储,匹配成功返回1,失败返回0

zadd是添加有序集合,zrange正序查看,zrevrange是反序查看
>zadd hackers 1940 "Alan Kay"
>zadd hackers 1957 "Sophie Wilson"
>zadd hackers 1953 "Richard Stallman"

>zrange hackers 0 -1
>zrevrange hackers 0 -1
使用withscores参数返回记录值
>zrange hackers 0 -1 withscores

):exists和del
>set mykey hello
>exists mykey
>del mykey
>exists mykey

):type and keys
type查看value的类型,没有则返回none,keys查看key列表
>set mykey x
>type mykey
>keys my*
>del mykey
>keys my*
>type mykey

):randomkey and clear

): rename and renamenx
>rename mylist newlist

):dbsize
返回当前数据库的key总数

):expire。限制key生存时间,单位秒
>set key some-value
>expire key 10
>get key
>get key.    10m后执行时,值已不存在

):限时操作可以在set命令中实现,ttl查询key的剩余生存时间
>set key 100 ex 30.   (30秒)
>ttl key
>ttl key

):flushdb:清空当前数据库中的所有键
):flushall:清空所有数据库中的所有键

):config get and config set
config get:用于读取运行redis服务器的配置参数
config set:用于更改运行redis服务器的配置参数
auth:认证密码
>config get requirepass     (查看密码)
>config set requirepass test123  (设置密码)
>config get requirepass     (报错,没有认证)
>auth test123
>config get requirepass

查询数据类型的最大条目:
>config get *max-*-entries*

config resetstat:重置数据统计报告

):info查询redis的相关信息
reg:
>info keyspace
>info server
>info cpu

):设置密码
grep -n requirepass /etc/redis/redis.conf
sudo vim /etc/redis/redis.conf
将# requirepass foobared 改为. requirepass test123 即可

):重启redis-server与密码验证
sudo service redis-server restart
redis-cli 
>info
>auth test123
>info
第二种方式:
redis-cli -a test123
>info

):redis事务处理,exec顺序执行队列中的命令
>multi      (进入事务)
>set name a
>set name b
>exec
>get name

):持久化机制
1.快照。默认方式
2.aof

save 300 10 #300秒内如果超过10个key被修改,则快照保存

配置文件中的可配置参数:
appendonly yes //启用aof持久化方式
#appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证了数据的完整持久化
appendfsync everysec。//每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no。//完全依赖os,性能最好,持久化没有保证

>help save
>save




=======================
redis系统版
redis 01。 

1.介绍
1.1 redis是什么
redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
1.2redis主要特点
支持数据的持久化,可以讲内存中的数据保存在磁盘中,重启的时候自动再次加载进行使用
既支持key-value类型的数据操作,还提供list,set,zset,hash等数据结构的存储
支持数据的备份,采用master-slave模式的主从备份。
性能极高-redis能读的速度是11万次/s,写的速度是8万次/s。
所有操作均为原子性操作
丰富的实用特性,如订阅-发布模式,生产者消费者模式,key过期等常用易用的模式

1.3竞品组件
MemoryCache-kv🌟缓存数据库:单进程多线程模型
Apache Ignite-分布式关系型缓存数据库
SSDB-kv型缓存数据库

2.redis安装与基本操作
windows安装
    资源链接入口地址:https://github.com/MicrosoftArchive/redis/releases
    下载导航-选择2.8.x版本均可
    下载完成解压即可完成
    开启服务
        cmd进入对应目录后,找到服务命令-redis-server.exe,至少设置maxheap后即可运行,如设置最大可展256M内存,则对应的字节为268435456=256*1024KB*1024B
        redis-server.exe --mapheap 268435456 
    通过配置文件启动服务
        修改redis.windows.conf中的maxheap参数值为268435456
    redis客户端链接redis服务器
        cmd进入对应目录后,找到服务命令redis-cli.exe
        直接运行即可,默认链接127.0.0.1 6579端口
        或者自己指定ip ,port
        redis-cli.exe -h 127.0.0.1 -p 6379

linux安装
    资源入口链接-http://download.redis.io/releases/
    下载导航-选择2.8.x版本均可
    下载地址为:http://download.redis.io/releases/redis-2.8.24.tar.gz
        通过浏览器直接打开,或者wget均可
    下载完成后,直接解压为源码包,需要编译后方可使用
    编译过程与server运行
    tar -xzvf redis-2.8.24.tar.gz
    cd redis-2.8.24
    make
    cd src
    ./redis-server
    或者./redis-server ../redis.conf //按指定的参数文件来启动redis-server,参数文件配置等同widows的conf文件

    查看端口:lsof -i:6379  or. ll /proc/24482.  or. ps aux|grep redis
    maxmemory. 为最大内存。 默认是电脑的最大内存

    客户端链接server
        cd src
        ./redis-cli


redis不同版本之间的互联:
    window的redis-cli链接linux-redis server

bat脚本语言(win):(linux是shell)
    auto_startserver.bat:
        redis-server.exe redis.windows.conf
    auto_startclient.bat:
        redis-cli.exe -h 127.0.0.1 -p 6379

3. redis重要说明
3.1 redis架构设计说明
    单进程单线程模型的KV数据库
        多线程处理可能涉及到锁
        多线程处理会涉及到线程切换而消耗CPU
        无法发挥多核CPU性能,不过可以通过在单机开多个redis实例来完善
    完全基于内存
    数据结构简单,对数据操作也简单
    使用多路I/O复用模型(网络io事件模型-epoll)
        网络IO都是通过socket实现,server在某一个端口持续监听,客户端通过socket(IP+port)与 服务器建立连接
        (serversocket.accept),成功建立连接之后,就可以使用socket中封装的InputStream和OutputStream进行IO交互了。
        针对每个客户端,Server都会创建一个新线程专门用于处理
        默认情况下,网络IO是阻塞模式,即服务器线程在数据到来之前处于阻塞状态,等到数据到达,会自动唤醒服务器线程,着手进行处理。阻塞模式下,一个线程只能处理一个流的IO事件
        5种网络IO模型。 (单线程的数据最好是要精简)
            阻塞IO,非阻塞IO,IO复用模型,信号驱动IO,异步IO模型
            IO复用模型中包括:select模式,poll模式,epoll模式(event poll模式),其中epoll是select和poll模型的升级优化,使得一个线程可以最大限度,最高效的监听和响应更多路客户端的IO请求

3.2     redis持久化重要说明    
    redis数据存储模式只有两种
        cache-only
            只做为“缓存”服务,数据均在内存中,不持久化数据,服务停掉则数据全部丢失,且无恢复方法,高速但安全性低
        persistence
            数据不只是在内存中,还会以配置的持久化方式持久化到磁盘中,保证服务停止后数据还可以恢复
            持久化方式选择
                RDB:默认
                    在某个条件番组后触发,一次性快照(snapshot)。将所有数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
                    snapshot触发的时机,是有“间隔时间”和“变更次数”共同决定,同时符合2个条件才会触发snapshot,否则“变更次数”会被继续累加到下一个“间隔时间”上。
                    snapshot过程上启动一个独立的子进程完成,故并不阻塞客户端请求。snapshot首先将数据写入临时文件,当成功结束后,将临时文件重命名为dump.rdb
                    rdb优缺点说明:
                        优点:
                            文件紧凑
                            形式简单即单rdb文件
                            由子进程完全独立搞定对主进程无影响
                            恢复速度快
                        缺点:
                            每次保存都是保存一个完整数据集的操作,持续时间可长可短,对丢失数据控制力不佳
                            若数据量过大,造成CPU和IO压力大,会影响主线程服务性能
                Append-only file(AOF)
                    将“写操作+数据”以格式化指令的方式追加到操作日志文件的尾部,“日志文件”保存了历史所有的操作过程
                    当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。
                    由于aof操作是发生在后台异步线程执行,可以采用no文件同步(交给操作系统策略同步),每秒钟fsync同步一次,每个写入发生时fsync同步一次,默认为每秒同步一次。
                    aof也不是绝对无数据丢失的:aof是写入内存cache,由后台线程按照aof策略执行fsync,极端情况下依然会丢失相应的数据
                    aof优缺点说明:
                        优点:
                            数据持久化更及时,效果更好
                            尾部追加方式,且为后台线程执行,效果很高,亦不影响主线程服务性能
                            自动进行aof日志重写和替换,达到适时瘦身的效果
                            日志文件为文本形式,易读易维护易修复
                        缺点:
                            aof日志文件体积一般比rdb方式要大
                            在数据恢复时,aof的恢复速度一般是慢于rdb

4.redis常用命令
    redis设置密码
        在redis.conf中,修改requirepass参数
        requirepass xxxxxx
        重新启动redis-server  ./redis-server ../redis.conf
        客户端带密码连接
        ./redis-cli -a xxxxxx
        客户端先进入后命令验证
        ./redis-cli
        auth xxxxxx

    key常用命令:(第11集)
    set key value
    get key
    del key
    dump key                 //返回key对应的序列化后的值
    keys pattern            //常用的是keys *
    exists key
    expire key seconds        //给指定key设置失效时间
    expireat key timestamp    //以截止时间为失效时间段(时间戳/s)
    ttl key                 //返回剩余存活时间,-1为永久,-2为没有
    randomkey                
    rename key newkey
    renamenx key newkey        //当newkey不存在时,将key改为newkey
    type key                 

5.hashmap常用命令
    hset map1 k1 v1
    hsetnx key field value
    hvals key                 //获取其所有的key值
    hexists key field        
    hget key value
    hgetall key    
    hkeys key
    hlen key                 //取得所有的键值
    hmget key field1 [field2]...
    hmset key field1 value1 [field2 value2]

6.list常用命令以及生产者消费者模式的实现
    lpush
    lpushx
    lrange key index_start index_stop    //获取指定范围的value
    rpop key                 //移除并获取列表中最后一个参数
    rpush
    rpushx
    llen key                 
    lpop key                 //移除并获取列表中第一个参数
    //这里用下面两个参数来实现生产者消费者。
    //多开几个redis来模拟生产者消费者的意思,即1个先长时间阻塞住,另外几个来往里面生产
    blpop key1 [key2] timeout    //移出并获取列表的第一个数,如果没有值取则阻塞timeout秒
    brpop key1 [key2] timeout

7.set和zset
    set主要存储的是String类型. hash表实现
    sadd key member1 [member2]
    srem key member1 [member2]     //删除
    sismember key member             //判断key在set里面是否存在
    smembers key                     //返回所有成员
    smove A B member
    spop key
    sunion key1 [key2]                 //返回指定所有集合的并集
    sunionstore C key1 [key2]         //并集后存储到C集合
    sinter key1 [key2]
    scard key                         //获取集合成员数
    sdiffstore C key1 [key2]        //差集,存到C
    sinterstore C key1 [key2]

    zset(SortedSet)有序集合
    跟set比多了一个double的分数参数,从小到大排序

    zadd key score value
    zcard key
    zcount key min max                //计算有序集合中指定区间分数的成员数
    zincrby key increment member     //对指定成员的分数加上增量increment
    zinterstore C numbkeys key[key...]        //交集,C
    zlexcount key min max             //计算指定字典区间内成员数
    (- + 指全部; [:指定特定值)
    zrange key start stop             //通过索引区间返回有序集合内指定区间内成员
    zrangebylex key min max         //通过字典区间返回成员
    zrank key member                 //返回指定成员的索引
    zrem
    zscore key member                 //返回有序集中成员的分数值
    ...

8.使用HyperLogLog结构做高效基数统计
    基数这里就是去重的意思
    1.硬统计-hashset (1000万个)
    2.bitset:位图:-bloomfilter
    3.概率统计基数:极小的空间,通过概率方式求出巨大数量的一个基数结果,reg:几十亿。但是不够精准。
    在1%标准误差范围内,可以用该结构。
    优点:输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的,且很小的。每个HyperLogLog键只需要12KB内存,即可计算近2^64个不同元素的基数。且其所占存储空间并不是线性增长的。
    只计算基数,并不存储数据本身,故不能查看元素。
    pfadd hyper1 v1 v2 v3
    pfcount hyper1 (reg:统计网站的UV信息等)


redis事务
    可以理解为批量执行单条命令。而且中间不会被其它事物打断。
    multi
    set k1 v1
    set k2 v2
    set k2 v3
    exec     (上面命令批量执行)
    multi
    set k1 v1
    discard     //取消事务,取消set k1 v1 这个块的命令

    redis连接服务器操作
    echo "123"
    ping 127.0.0.1             //PONG代表OK
    quit
    select index             //切换到指定的数据库,默认有16个数据库,默认选择索引为0的数据库
    bgrewriteaof
    ...
    dbsize
    flushall         清空所有数据库key
    flushdb            清空当前数据库key
    lastsave
    monitor            调试时用,监控
    save
    shudown
    slaveof host port     将当前服务器变为指定服务器的从属服务器

    slaveof 127.0.0.1 6379 -a tianliangedu


java操作redis
    ·java操作redis的第三方库jedis

com.utils 
public class RedisUtil{
    main(){
        //连接本地的Redis服务
        Jedis jedis = new Jedis("localhost",6379);
        jedis.auth("tianliangedu");
        //查看服务是否运行
        sout("服务正在运行:" + jedis.ping());
        //添加kv
        jedis.set("jedis_k1","jedis_v1");
        sout(jedis.get("jedis_k1"));
        //添加集合
        jedis.hset("set1","set_k1","set_v1");
        sout(jedis.hget("set1","set_k1"));
    }
}

6.redis使用场景
    ·加速数据库访问
        ·缓存一些静态数据 (不需要去mysql数据库里查)
        ·缓存一些不经常变化数据
        ·缓存一些高耗时计算的数据
        ·缓存一些预计算的数据
        ·充当中间件,做系统模块或子系统之间的解耦使用。(可以不用http通信)
-------------本文结束期待您的评论-------------