文档章节

redis 安装和简单使用

xiaozhou18
 xiaozhou18
发布于 2016/12/08 15:16
字数 3824
阅读 45
收藏 1

一、redis 安装   

1、首先安装c的编译环境

     yum -y install cpp

    yum -y install binutils

    yum -y install glibc

    yum -y install glibc-kernheaders

    yum -y install glibc-common

    yum -y install glibc-devel

    yum -y install gcc

    yum -y install make

2、解压:tar -zxvf redis-2.8.19.tar.gz

3、编译、安装

make  命令[root@node1 redis-3.0.0]# make

make install  命令[root@node1 redis-3.0.0]# make install

4、拷贝配置文件

cp redis/redis.conf /etc/

修改配置文件redis.conf

daemonize yes(后台运行)

logfile “/usr/local/java/redis-3.0.0/log”(日志文件)

5、启动

命令    redis-server /etc/redis.conf [--port 6379]    后台启动

6、redis客户端

命令     redis-cli [-h 127.0.0.1] [-p 6379]

7、关闭

redis-cli shutdown

二、基础命令

获得符合规则的键名称

keys 表达式(?,* ,[],\?)   如keys *  查看所有key的信息

判断一个键是否存在

exists key   如exists aa 返回1表示key存在    0   表示key不存在

删除键

del key    如del aa

del key1 key2

批量删除

redis-cli del `redis-cli keys "key*"`

获得键值的数据类型type

返回值可能是这五种类型(string,hash,list,set,zset)

注意:redis不区分命令大小写

三、redis的help命令

help @<group>  查看哪种数据类型怎么用的   如help @string

help <command>  查看哪种命令怎么用的   如 help set

quit 退去redis客户端

四、redis 各种数据类型的操作命令

1、string类型

set    存一个key value类型的数据   如set  aa  bb

get    根据key查询value值    如get aa

setnx  表示如果该key存在就不覆盖value

mset  一次存储多个key value  如mset aa aa bb bb cc cc

mget  一次获取多个key的value  如mget aa bb cc

incr  表示如果一个key的value的类型是数字 每执行一次incr命令该key的value的值就会自增1  如 incr aa

decr  表示如果一个key的value的类型是数字 每执行一次decr 命令该key的value的值就会自减1  如 decr  aa

incrby    表示如果一个key的value的类型是数字  该key的value按照指定的数字增加  如incrby   aa 10

decrby     表示如果一个key的value的类型是数字  该key的value按照指定的数字减少 如decrby   aa 10

incrbyfloat  表示如果一个key的value的类型是数字  该key的value按照指定的小数增加如incrbyfloat aa 0.12

append  表示在value的后面拼接   如append  aa 11

strlen  表示返回value的长度  如strlen   aa

2、hash类型  hash类型适合存储对象

hset    存一个key  key  value类型的数据   如hset user1 name zs

hget    根据key下的key查询value值    如hget user1 name

hmset 一次存储多个key key value    如hmset user3 name lisi age 10 qita wu

hmget    一次取key下的多个key的value值如 hmget user3 name age love

hgetall    获取key下的所有信息 如 hgetall user3

hsetnx  表示如果该key下key的value存在就不覆盖value 如 hsetnx user3 name ww

hexists,判断键中的属性是否存在  如hexists user3 name

hincrby   表示如果一个key下key的value的类型是数字  该key的value按照指定的数字增加 如hincrby user3 age 10

hdel    删除key下某个key的值  如hdel user3 age

hkeys    获取key下的所有key的信息   如hkeys user3

hvals    获取key下的所有value的值    如 hvals user3

hlen    获取键中包含多少个key  如 hlen user3

3、list类型    list是一个有序的字符串列表

lpush    从左面开始存一个key  多个 value类型的数据   如lpush list 1 2 3 4 5

rpush    从右面开始存一个key  多个 value类型的数据   如rpush list 1 2 3 4 5

lpop    每执行一次会从集合的左面删除一条数据  如lpop list

rpop    每执行一次会从集合的右面删除一条数据  如rpop list

llen    查看集合的长度   如llen list

lrange(-1表示最后一个元素的位置)  查看指定范围的数据  如lrange list 0 -1

lrem(lrem key count value)count分为三种情况  如 lrem list 2 3

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。

count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。

count = 0 : 移除表中所有与 value 相等的值。

lindex    查询指定角标数据      如lindex list 1

lset      修改指定脚标的数据      如 lset list 1 10

ltrim    截取指定脚标的数据        如ltrim list 0 1

linsert    向指定元素前后插入元素  如linsert list before2 3 或 linsert list after 2 3

rpoplpush:将元素从一个列表转到另一个列表  rpoplpush list list1

4、set类型   set集合中的元素都是不重复的,无序的

sadd     存一个key 多个value类型的数据   如sadd set1 1 2 3 4 5

smembers    获取key的所有value信息    如smembers set1

srem            删除key下的一个或多个value        如 srem set1 4

sismember     判断key下的value存不存在  存在返回1不存在返回0    如sismember set1 1

sdiff    返回两个集合中和第一个集合不同的元素   如sdiff set2 set1

sinter(交集)    返回两个集合中相同的元素   如sinter set1 set2

sunion(并集)    返回两个集合中所有不重复的元素   如 sunion set1 set2

sdiffstore    把两个集合中和第一个集合不同的元素 保存到另一个集合里  如sdiffstore set3 set1 set2

sinterstore  把两个集合中相同的元素保存到另一个集合里     如 sinterstore set4 set1 set2

sunionstore    把两个集合中所有不重复的元素 保存到另一个集合里     如 sunionstore    set4 set1 set2

scard        获取集合长度            如scard set4

spop    随机从集合中取出并删除一个元素   如spop set4

srandmember key [count]            如 srandmember set2 10

如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。

如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值

5、sorted set  有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数

zadd     存一个key 多个value类型的数据   如zadd sort1 10 1 20 2 30 3    分值越大越靠后

zscore    获得某个value的分值是多少    如zscore sort1 1

zrange     查看指定范围的数据   如zrange sort1 0 -1  (-1表示最后一个元素)

zrevrange    反向查看指定范围的数据   如zrevrange   sort1 0 -1  (-1表示最后一个元素)

zrangebyscore 通过分值查询value(默认是闭区间,可使用"("使用开区间)   如zrangebyscore   sort1 8 (10

zincrby      给某个value按指定的数增加分值    如zincrby  sort1 100 32

zcard   查看key下value的数量     如zcard sort1

zcount        获取指定分数范围的元素个数      如zcount sort1 10 20

zrem    删除指定的value   如zrem sort1 33 34

zremrangebyrank        删除指定范围的数据    如zremrangebyrank sort1 0 -1

zremrangebyscore    删除指定分数范围内的数据    如zremrangebyscore   sort 10 100

+inf(正无穷)       该value   排在最下面

-inf(负无穷)     该value   排在最上面

五、redis中键的生存时间  expire

redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它。

expire  设置生存时间(单位/秒)       如  expire sort1 10

pexpire设置生存时间(单位/毫秒)    如 pexpire    sort1 1000

ttl  查看key还有多少秒过期    如ttl sort1

pttl   查看key还有多少毫秒秒过期    如pttl  sort1

persist  取消生存时间        如persist  sort1

expireat    指定一个时间戳到该时间戳后 key过期   如 expireat  sort1 1351858600  

pexpireat  指定一个时间戳(毫秒)到该时间戳后 key过期   如 expireat  sort1 13518586000000  

六、redis数据的排序

sort命令可以对列表类型,集合类型和有序集合类型键进行排序。

sort key [desc] [limit offset count]  如sort list1 desc limit 0 3

by 参考键(参考键可以是字符串类型或者是hash类型的某个字段,hash类型的格式为:键名->字段名)

如果参考键中不带*号则不排序

如果某个元素的参考键不存在,则默认参考键的值为0

扩展 get参数

get参数的规则和by参数的规则一样

get # (返回元素本身的值)

如 参考键是字符串   sort list1 by stu:*  get # get stu:*

如 参考建是hash    sort list1 by user:*->age get # get user:*->name

扩展 store参数

使用store 参数可以把sort的排序结果保存到指定的列表中

如 sort list1 by stu:*  get # get stu:* store list2

性能优化

1:尽可能减少待排序键中元素的数量

2:使用limit参数只获取需要的数据

3:如果要排序的数据数量很大,尽可能使用store参数将结果缓存。

七、redis持久化

1、RDB

rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在redis根目录的dump.rdb文件中。(文件名在配置文件中dbfilename)

redis进行快照的时机(在配置文件redis.conf中)

save 900 1:表示900秒内至少一个键被更改则进行快照。

save 300 10

save 60 10000

redis自动实现快照的过程,见备注

手动执行save或者bgsave命令让redis执行快照。

两个命令的区别在于,save是由主进程进行快照操作,会阻塞其它请求。bgsave是由redis执行fork函数复制出一个子进程来进行快照操作。

文件修复:redis-check-dump

rdb的优缺点

优点:由于存储的有数据快照文件,恢复数据很方便。

缺点:会丢失最后一次快照以后更改的所有数据。

2、AOF

aof方式的持久化是通过日志文件的方式。默认情况下redis没有开启aof,可以通过参数appendonly参数开启。

appendonly yes

aof文件的保存位置和rdb文件的位置相同,都是dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改

appendfilename appendonly.aof

redis写命令同步的时机

appendfsync always 每次都会执行

appendfsync everysec 默认 每秒执行一次同步操作(推荐,默认)

appendfsync no不主动进行同步,由操作系统来做,30秒一次

aof日志文件重写

auto-aof-rewrite-percentage 100(当目前aof文件大小超过上一次重写时的aof文件大小的百分之多少时会再次进行重写,如果之前没有重写,则以启动时的aof文件大小为依据)

auto-aof-rewrite-min-size 64mb

手动执行bgrewriteaof进行重写

重写的过程只和内存中的数据有关,和之前的aof文件无关。

所谓的“重写”其实是一个有歧义的词语, 实际上, AOF 重写并不需要对原有的 AOF 文件进行任何写入和读取, 它针对的是数据库中键的当前值。

文件修复:redis-check-aof

动态切换redis持久方式,从 RDB 切换到 AOF(支持Redis 2.2及以上)

CONFIG SET appendonly yes

CONFIG SET save ""(可选)

注意:当redis启动时,如果rdb持久化和aof持久化都打开了,那么程序会优先使用aof方式来恢复数据集,因为aof方式所保存的数据通常是最完整的。

注意:如果想把正在运行的redis数据库,从  RDB切换到AOF,建议先使用动态切换方式,再修改配置文件,重启数据库。(不能自己修改配置文件,重启数据库,否则数据库中数据就为空了。)

八、redis的config命令

使用config set可以动态设置参数信息,服务器重启之后就失效了。

config set appendonly yes

 config set save "90 1 30 10 60 100"

使用config get可以查看所有可以使用config set命令设置的参数

config get *

使用config rewrite命令对启动 Redis 服务器时所指定的 redis.conf 文件进行改写(Redis 2.8 及以上版本才可以使用),主要是把使用config set动态指定的命令保存到配置文件中。

config rewrite

注意:config rewrite命令对 redis.conf 文件的重写是原子性的, 并且是一致的: 如果重写出错或重写期间服务器崩溃, 那么重写失败, 原有 redis.conf 文件不会被修改。 如果重写成功, 那么 redis.conf 文件为重写后的新文件。

九、redis安全策略

设置数据库密码

修改配置requirepass password

验证密码auth password

注意:在配置redis复制功能的时候如果主数据库设置了密码,需要在从数据的配置文件中通过masterauth参数设置主数据库的密码,这样从数据库在连接主数据库时就会自动使用auth命令认证了。相当于做了一个免密码登录。

bind参数(可以让数据库只能在指定IP下访问)

bind 127.0.0.1

命令重命名

修改命令的名称rename-command flushall cleanall

禁用命令 rename-command flushall ""

十、用java简单操作redis

package cn.crxy.redis.test8;

import static org.junit.Assert.*;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Transaction;

public class RedisTest {
    
    String host = "192.168.1.170";
    int port = 6379;
    Jedis jedis = new Jedis(host, port);
    
    /**
     * 单机单链接方式
     * 使用java代码操作redis
     * 一般只用于测试代码
     * @throws Exception
     */
    @Test
    public void test1() throws Exception {
        jedis.set("aa", "11");
        String string = jedis.get("aa");
        System.out.println(string);
    }
    
    
    /**
     * 单机连接池方式
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(100);//总连接数
        poolConfig.setMaxIdle(10);//空闲链接数
        poolConfig.setMaxWaitMillis(3000);//创建连接的超时时间
        poolConfig.setTestOnBorrow(true);//在创建连接的时候是否会测试
        JedisPool jedisPool = new JedisPool(poolConfig, host, port);
        Jedis jedis = jedisPool.getResource();
        String string = jedis.get("aa");
        System.out.println(string);
        jedisPool.returnResourceObject(jedis);
    }
    
    
    /**
     * 限制用户访问频率
     * @throws Exception
     */
    @Test
    public void test3() throws Exception {
        
        for(int i=0;i<20;i++){
            boolean checkLogin = checkLogin("192.168.1.1");
            System.out.println(checkLogin);
        }
        
        
        
    }
    
    
    public boolean checkLogin(String ip){
        String value = jedis.get(ip);
        if(value==null){
            jedis.set(ip, 0+"");
            jedis.expire(ip, 60);
        }else{
            int parseInt = Integer.parseInt(value);
            if(parseInt>=10){
                System.out.println("访问受限。。。。");
                return false;
            }
        }
        jedis.incr(ip);
        return true;
    }
    
    
    
    @Test
    public void test4() throws Exception {
        String value = jedis.get("aa");
        System.out.println("休息一会。。。");
        Thread.sleep(5000);
        Transaction multi = jedis.multi();
        int parseInt = Integer.parseInt(value);
        parseInt++;
        multi.set("aa", parseInt+"");
        List<Object> exec = multi.exec();
        System.err.println(exec);
        
    }
    
    @Test
    public void test5() throws Exception {
        jedis.watch("aa");
        jedis.unwatch();
        String value = jedis.get("aa");
        System.out.println("休息一会。。。");
        Thread.sleep(5000);
        Transaction multi = jedis.multi();
        int parseInt = Integer.parseInt(value);
        parseInt++;
        multi.set("crxy", parseInt+"");
        List<Object> exec = multi.exec();
        
        if(exec==null||exec.size()==0){
            System.err.println("值被修改,执行失败");
            test5();
        }
    }
    
    
    
    @Test
    public void test6() throws Exception {
        Jedis jedis2 = RedisUtils.getJedis();
        String string = jedis2.get("aa");
        System.out.println(string);
        RedisUtils.returnJedis(jedis2);
    }
    
    @Test
    public void test7() throws Exception {
        SortingParams sortingParameters;
    }
    
    
    @Test
    public void test8() throws Exception {
        long starttime = System.currentTimeMillis();
        for(int i=0;i<1000;i++){
            jedis.set("x"+i, i+"");
        }
        System.out.println(System.currentTimeMillis()-starttime);
    }
    
    @Test
    public void testtest9() throws Exception {
        long starttime = System.currentTimeMillis();
        Pipeline pipelined = jedis.pipelined();
        for(int i=0;i<1000;i++){
            pipelined.set("y"+i, i+"");
        }
        List<Object> syncAndReturnAll = pipelined.syncAndReturnAll();
        pipelined.close();
        System.out.println(System.currentTimeMillis()-starttime);
    }
    
    
    
    @Test
    public void testSentinel() throws Exception {
        Set<String> sentinels = new HashSet<String>();
        sentinels.add("192.168.1.170:26379");
        sentinels.add("192.168.1.171:26379");
        
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //TODO--
        JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels, poolConfig );
        HostAndPort currentHostMaster = jedisSentinelPool.getCurrentHostMaster();
        System.out.println(currentHostMaster.getHost()+"--"+currentHostMaster.getPort());
        Jedis jedisres = jedisSentinelPool.getResource();
        String value = jedisres.get("aa");
        System.out.println(value);
    }
    
    @Test
    public void testCluster() throws Exception {
        Set<HostAndPort> nodes = new HashSet<HostAndPort>();
        nodes.add(new HostAndPort("192.168.1.170", 7000));
        nodes.add(new HostAndPort("192.168.1.170", 7001));
        nodes.add(new HostAndPort("192.168.1.170", 7002));
        nodes.add(new HostAndPort("192.168.1.170", 7003));
        nodes.add(new HostAndPort("192.168.1.170", 7004));
        nodes.add(new HostAndPort("192.168.1.170", 7005));
        
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //TODO--
        JedisCluster jedisCluster = new JedisCluster(nodes, poolConfig );
        String string = jedisCluster.get("aa");
        System.out.println(string);
        
    }

}
 


 

 

© 著作权归作者所有

上一篇: Redis3.0集群安装
下一篇: solr的简单使用
xiaozhou18
粉丝 4
博文 44
码字总数 89781
作品 0
哈尔滨
程序员
私信 提问
centos---存储系统 Redis 简介及编译安装

Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。Redis的键值可以包括字符串(strings)、哈希(hashes)、列表(lis...

durban
2012/03/20
335
0
通过URLOS安装Redis缓存为wordpress网站提速

快!快!快!我们都知道网站的加载速度直接影响用户体验。据研究发现,网站页面在3秒内加载完毕对用户而言是最佳的浏览体验。如果超过这个时间,用户跳出网站的几率会非常大。所以对于站长来...

yeqing112
07/09
460
0
Redis在Centos7下安装,与phpredis扩展安装

Centos7 安装Redis 使用YUM yum install -y redis 2. 源码包安装 下载源码包 $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz$ tar xzf redis-2.8.17.tar.gz$ cd redis-2.8.......

寻找普拉多
2015/12/06
648
0
使用Nginx+Lua+Redis进行Web开发

Openresty自带了Redis的接口。其实也就是一个lua脚本,该脚本负责了解redis,操作redis。 没有安装Openresty的同学,参考上一篇,安装Openresty。 没有安装Redis的同学,自己找个教程安装下,...

醉人的笑容你有没有
2016/04/17
689
0
Redis 简介及在 Linux 下的编译安装

Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。Redis的键值可以包括字符串(strings)、哈希(hashes)、列表(lis...

鉴客
2011/07/18
2.2K
1

没有更多内容

加载失败,请刷新页面

加载更多

采坑指南——k8s域名解析coredns问题排查过程

正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一个nginx服务 apiV...

码农实战
12分钟前
1
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第6题

choose three Which three statements are true about indexes and their administration in an Orade database? A) An INVISIBLE index is not maintained when Data Manipulation Language......

oschina_5359
15分钟前
1
0
阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。...

阿里巴巴云原生
20分钟前
1
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

xiangyunyan
23分钟前
3
0
js 让textarea的高度自适应父元素的高度

textarea按照普通元素设置height是没有作用的,可以这么来设置, 下面给上一段项目代码 JS代码: $.fn.extend({ txtaAutoHeight: function () { return this.each(function () {...

文文1
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部