Redis

database

NoSql (Not Only Sql) 非关系型数据库


行式存储数据库    一般的关系型数据库Mysql,Oracle,SqlServer等
列式存储数据库    Cassandra 
文档型数据库 MongoDB
key-value型数据库:

Memcached
    早期的NoSql数据库
    数据在内存中,不能持久化
    支持简单的key-value模式
    一般作为缓存数据库
    
Redis 
    包含了Memcached的大部分功能
    数据在内存中,支持持久化,用作备份
    除了支持简单的key-value模式,还支持多种数据结构的存储,如list,set,hash, zset
    用作缓存数据库一般
    
    

一 . Redis 的 安装与启动

$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz

$ tar -xzvf redis-5.0.5.tar.gz

$ cd redis-5.0.5

$ make

问题:

 make时报错解决:缺少命令gcc..

$ yum install gcc gcc-c++

 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

解决方案1 : 

$ make MALLOC=libc         //注意等号两边不能有空格

解决方案2 : 

$ make distclean  //在make之前执行此命令

$ make

 

In order to install Redis binaries into /usr/local/bin just use:

$ make install

You can use `make PREFIX=/some/other/directory install` if you wish to use a different destination.

 

 

启动redis 

$ redis-server

配置redis 后台启动

修改redis.conf 文件:

# By default Redis does not run as a daemon. Use "yes" if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize no

no 改为 yes 

然后:

redis-server redis.conf //此命令可带参数 指定配置文件的位置

查看服务启动与否:

启动成功:

没启动或失败:

 

二 . redis 服务 命令行接口: redis-cli  客户端

        用来和redis服务通信的

  127.0.0.1:6379> help @server

  BGREWRITEAOF - 异步重写AOF

  BGSAVE - 异步保存数据集到磁盘

  CLIENT GETNAME - 拿到当前连接名

  CLIENT ID - 返回当前连接的客户端ID

  CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no] 杀死某个客户端的连接

  CLIENT LIST - 拿到所有客户端的链接集合

  CLIENT PAUSE timeout 停止处理来自客户端的命令一段时间

  CLIENT REPLY ON|OFF|SKIP 指示服务器是否答复命令

  CLIENT SETNAME connection-name 设置当前的连接名

   ......

常用操作:

        多实例端口选择:

$ redis-cli -p 6379 //指定服务端口

$ 127.0.0.1:6379> ping

PONG

        单实例关闭:

$ redis-cli shutdown

//或进入redis-cli后在关闭

127.0.0.1:6379> shutdown

        指定端口关闭:

$ redis-cli -p 6379 shutdown

  
 

 

2)String类型 操作命令

 

 

三 . Redis 相关知识

 

1)  默认16个数据库,类似数组下标从0开始,初始默认使用0号库

    使用命令 select <dbid> 来切换数据库 ,如 select 12

2)统一密码管理,所有库都是同样的密码,要么都OK,要么一个也连接不上

3) Redis  单线程 + 多路IO复用

    串行     vs     多线程 + 锁 (Memcached)     vs     单线程 + 多路IO复用(Redis)

注:多路复用是指,使用一个线程来检查多个IO请求的就绪状态


 

 

四. Redis 五大数据类型

key

 Redis 的数据类型:  String     Set     list    hash    zset(有序Set)

 

0) 关于键 key 的命令

         查看当前库的所有键:    $ keys *

        判断某个键是否存在:    $ exists <key>

        查看键的类型:    $ type <key>

        删除某个键: $ del <key>

        为键值设置过期时间,单位秒: expire <key> <seconds>

        查看还有多少秒过期,-1表示永不过期,-2 表示已过期    ttl <key>

        查看当前数据库的key的数量 :     dbsize

        清空当前库: flushdb    flushall

 

  1)  String : 是Redis最基本的类型,一个key 对应一个 value

                是二进制安全的。意味着Redis的String可以包含任何数据,比如jpg图片或者序列化的对象

                是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

        操作命令:

                查询对应键值:    get <key>

                添加键值对:    set <key> <value>

                将给定的<value>追加到原值的末尾 : append <key> <value>

                获得值得长度:strlen <key>

                只有在key不存在时设置key的值:   setnx <key> <value>

                incr <key> : 将key中存储的数字值加1,只能对数字值操作,如果为空,新增值为1

                decr <key>: 将key中存储的数字值减1,只能对数字值操作,如果为空,新增值为 -1

                incrby/decrby <key> <步长> :   将 key 中储存的数字值增减。自定义步长

                mset <key1> <value1> <key2> <value2> ...

                mget <key1> <key2> <key3> ...

                msetnx <key1><value1> <key2> <value2> ...

                getrange <key> <起始位置> <结束位置>

                setrange <key> <起始位置> <value> :  用<vlaue>覆写<key>所存储的字符串值,

                从<起始位置>开始

                setex <key> <过期时间> value: 设置键值的同事,设置过期时间

                getset <key> <value>: 设置了新值的同时获得旧值

 

原子性: 所谓原子操作是指,不会被线程调度机制打断的操作

                在单线程中,能够在单条指令中完成的操作都可以认为是原子操作

                在多线程中,不能被其他进程或线程打断的操作就叫原子操作

                Redis单命令的原子性主要得益于Redis的单线程

 

2) List , 单键多值

               Redis列表是简单的字符串列表,按照插入顺序排序,可以在列表的头部(左边)或者          

                (右边) 添加一个元素

                底层: 是一个双向链表,所以两端操作性能很高,中间的节点性能较差

               注意: push / pop 操作 类似于栈,先push的在尾部

        操作命令:

                lpush/rpush <key> <value1> <value2> ...  从左边或右边插入一个或多个值

                lpop/rpop <key> 从左边/右边吐出一个值, 值在键在,值亡键亡

                rpoplpush <key1> <key2> 从<key1>列表右边吐出一个值,插入到<key2>列表的左边

                lrange <key> <start> <stop> : 按照索引下标获得元素(从左到右)

                lindex <key> <index> : 按照索引下标获得元素(从左到右)

                llen <key> 获得列表长度

                linsert <key> before <value> <newValue> : 在  <value>的前面插入 <newValue>

                lrem <key> <n> <value> : 从左边删除n个value(从左到右)

 

3) Set , 自动排重

              Set提供了判断某个成员是否在一个Set集合内的重要接口,List没有

              Redis的Set是String类型的无序集合

              底层: 是一个value 为 null 的hash表, 所以添加,删除, 查找的复杂度都是O(1)

    

     操作命令:

            sadd <key> <value1> <value2> ...  将一个或多个元素加入到集合中,如已存在,则忽略

            smembers <key> :  取出该集合的所有值

            sismember <key> <value> : 判断集合<key>是否含有该< value>值,有返回1,无返0

            scard <key> 返回集合元素个数

            srem <key> <value1> <value2> ... 删除集合中的某个元素

            spop <key> 随机从该集合中吐出一个元素

            srandmember <key> <n> : 随机从该集合中取出n个值, 不会从集合中删除

            sinter <key1> <key2> :  返回两个集合的交集元素

            sunion <key1> <key2> : 返回两个集合的并集元素

            sdiff <key1> <key2> : 返回两个集合的差集元素 sdiff <key2> <key1>

 

4) hash ,  是一个键值对集合

                 是一个String 类型的field 和 value 的映射表

                特别适合用于存储对象

                类似于 Java里面的 Map<String, Object>

 

    操作命令:

                hset <key> <field> <value> : 给<key> 集合中的 <field>键赋值 <value>

                hget <key1> <field> : 从<key1>集合 <field> 取出 value

                hmset <key1> <field1> <value1> <field2> <value2> ...   批量设置hash的值

                hexists key <filed>

                hkeys <key>

                hvals <key>

                hincrby <key> <field> <increment> : 为哈希表key中的域field的值加上增量increment

                hsetnx <key> <field> <value> : 将哈希表key中的域field的值设置为value ,

                当且仅当field不存在

 

5) ZSet (sorted set), 是一个有序的没有重复元素的字符串集合

                                       所有成员都关联了一个评分(score)

                                       评分score用来按照从最低分到最高分的方式排序集合中的成员

                                       成员唯一,评分可以重复

      操作命令:

                zadd <key> <score1> <value1> <score2> <value2> ...

                zrange <key> <start> <stop> [WITHSCORES]   by 下标

                zrangebyscore key min max [WITHSCORES]       by score

                zrevrangebyscore key max min [WITHSCORES] [limit offset count]

                zincrby <key> <increment> <value>

                zrem <key> <value>

                zcount <key> <min> <max>

                zrank <key> <value> : 返回该值在集合中的排名

                

                

       

五. Redis 的Java客户端 Jedis

 

1) 导包

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>3.0.1</version>

</dependency>

 

2) 连接虚拟机Redis服务注意事项

        1.  禁用Linux的防火墙  

            systemctl stop firewalld

        2.  redis.conf 中注释掉 bind 127.0.0.1 (60行左右)

             protect-mode (80行左右) 设置为 no

 

3) 测试连通性

public class JedisTest {

public static void main(String[] args) {

Jedis jedis = new Jedis("192.168.18.130", 6379);

jedis.select(3); //选择库

Set<String> keys = jedis.keys("*"); //获取键集

String ping = jedis.ping(); //输出 PONG

for (String key : keys) {

System.out.println(jedis.smembers(key)); //Set类型的遍历

}

}

}

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是 Redis 的全部内容, 来源链接: utcz.com/z/531515.html

回到顶部