Redis初学

一.redis简介

redis是一个nosql(not only sql不仅仅只有sql)数据库.翻译成中文叫做非关系型型数据库.
关系型数据库:以二维表形式存储数据
非关系型数据库: 以键值对形式存储数据(key, value形式)
是一家意大利的创业公司出的,然后后来这家公司被VMware赞助.
redis底层用C语句编写.
redis是将数据存放到内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中,
redis优点:存取速度快,官方称读取速度会达到30万次每秒,写速度在10万次每秒最有,具体限制于硬件.
缺点:对持久化支持不够良好,
所以redis一般不作为数据的主数据库存储,一般配合传统的关系型数据库使用.

  • redis主要就是使用命令来进行操作,java端在代码中可以使用Jedis来操作redis服务器

  • redis数据类型
    字符串String
    列表list redis中使用的是双向循环链表来实现的list,在redis中更像栈
    散列Hash 一般应用于将redis作为分布式缓存,存储数据库中的数据对象
    集合set set中数据是无序的并且不允许重复
    有序集合zset redis会根据分数自动排序,这里可以使用在学生成绩排序,
    或者是手机应用商店流行软件排名等需求中

  • redis持久化方案

    • rdb:可以设置间隔多长时间保存一次(Redis不用任何配置默认的持久化方案)
      优点:让redis的数据存取速度变快
      缺点:服务器断电时会丢失部分数据(数据的完整性得不到保证)
    • aof:可以设置实时保存
      优点:持久化良好,能包装数据的完整性
      缺点:大大降低了redis系统的存取速度
      将bin下的redis.conf文件里的appendonly 后的no改为yes则是aof方式。(不推荐)
  • 主从复制:
    这里使用了心跳检测机制,主从复制必须使用rdb持久化方式
    从服务器一般是只读的,保证主服务器和从服务器的数据一致性

在bin下输入./redis-cli -p 6380则进入修改端口为6380的redis

二.redis安装

  • 从官网下载
    http://download.redis.io/releases/redis-3.0.0.tar.gz
    在/usr/local下新建文件夹redis(mkdir redis),将redis-3.0.0.tar.gz拷贝到redis下

  • 在redis下解压源码
    tar -zxvf redis-3.0.0.tar.gz

  • 进入解压后的目录进行编译
    先cd /usr/local/redis-3.0.0
    再make

  • 安装到指定目录,如 /usr/local/redis
    先cd /usr/local/redis-3.0.0
    再make PREFIX=/usr/local/redis install


1.redis启动

前端启动:

前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法。

  • 此时redis下出现bin目录,进入该目录启动redis服务(前端启动)
    ./redis-server
  • 前端启动后需要再打开一个窗口,进入redis的bin目录下,先输入./redis-cli,再输入set key1 1
    再输入get key1 可得到设置的key1值也就是1

后端启动:

  • 进入解压后的redis目录下,即redis-3.0.7下,将redis.conf拷贝到/usr/local/redis/bin/下
    cp redis.conf /usr/local/redis/bin

  • 进入bin目录,为redis添加增删改查权限
    chmod 777 redis.conf

  • 修改redis.conf文件,vi redis.conf
    将daemonize后的no改成yes

  • 后端启动redis:在bin目录下输入./redis-server redis.conf进行启动

  • 查看进程:ps -aux | grep redis

  • 可以关闭该ssh窗口,在另一窗口redis-server程序不会结束,可执行get key1

停止:

  • cd /usr/local/redis
    ./bin/redis-cli shutdown

三.jedis

Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。
在企业中用的最多的就是Jedis.

1.连接测试

无连接池:

 @Test
    public void testJedis1(){
        //创建和redis的连接
        Jedis jedis = new Jedis("192.168.239.133",6379);
        //存入
        jedis.set("key2","2");
        //取出
        System.out.println(jedis.get("key2"));
        jedis.close();
    }//输出结果:2

若出现连接超时的bug,则检查防火墙是否关闭,在bin下输入命令service iptables stop关闭防火墙,则连接成功

有连接池:ApplicationContext.xml配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

    <!-- 连接池配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大连接数 -->
        <property name="maxTotal" value="30" />
        <!-- 最大空闲连接数 -->
        <property name="maxIdle" value="10" />
        <!-- 每次释放连接的最大数目 -->
        <property name="numTestsPerEvictionRun" value="1024" />
        <!-- 释放连接的扫描间隔(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <!-- 连接最小空闲时间 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
        <property name="softMinEvictableIdleTimeMillis" value="10000" />
        <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
        <property name="maxWaitMillis" value="1500" />
        <!-- 在获取连接的时候检查有效性, 默认false -->
        <property name="testOnBorrow" value="true" />
        <!-- 在空闲时检查有效性, 默认false -->
        <property name="testWhileIdle" value="true" />
        <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
        <property name="blockWhenExhausted" value="false" />
    </bean>

    <!-- redis单机 通过连接池 -->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
        <constructor-arg name="host" value="192.168.239.133"/>
        <constructor-arg name="port" value="6379"/>
    </bean>
</beans>

测试代码:

public class JedisSpringTest {
    private ApplicationContext applicationContext;
    public void setUp(){
        String configLocation = "classpath:ApplicationContext.xml";
        applicationContext = new ClassPathXmlApplicationContext(configLocation);
    }

    public void testSpringJedis(){
        JedisPool jedisPool = (JedisPool) applicationContext.getBean("jedisPool");
        Jedis jedis = jedisPool.getResource();
        jedis.set("key4","bbb");
        System.out.println(jedis.get("key4"));
    }

四.命令

当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。

赋值set key value例子127.0.0.1:6379> set test 123
取值get key例子get test
取值时同时对key进行赋值操作GETSET key value
删除Del key127.0.0.1:6379> del test
递增数字INCR key127.0.0.1:6379> incr num
增加指定的整数INCRBY key increment127.0.0.1:6379> incrby num 2
递减数值DECR key
减少指定的整数DECRBY key decrement127.0.0.1:6379> decr num

其他命令:

向尾部追加值 
APPEND key value
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。 
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str " world!"
(integer) 12
127.0.0.1:6379> get str 
"hello world!"


获取字符串长度 
STRLEN key
STRLEN命令返回键值的长度,如果键不存在则返回0。 
127.0.0.1:6379> strlen str 
(integer) 0
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> strlen str 
(integer) 5

同时设置/获取多个键值 
MSET key value [key value …]
MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mget k1 k3
1) "v1"
2) "v3"


Redis Hash命令:

赋值
HSET key field value	一次只能设置一个字段值
127.0.0.1:6379> hset user username zhangsan 
(integer) 1
-----------------------------
HMSET key field value [field value ...]		一次可以设置多个字段值
127.0.0.1:6379> hmset user age 20 username lisi 
OK


取值 
HGET key field			一次只能获取一个字段值
127.0.0.1:6379> hget user username
"zhangsan“
----------------------------
HMGET key field [field ...]				一次可以获取多个字段值
127.0.0.1:6379> hmget user age username
1) "20"
2) "lisi"
----------------------------
HGETALL key
127.0.0.1:6379> hgetall user
1) "age"
2) "20"
3) "username"
4) "lisi"
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0.


删除字段
可以删除一个或多个字段,返回值是被删除的字段个数 
HDEL key field [field ...]
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age name
(integer) 0
127.0.0.1:6379> hdel user age username
(integer) 1 


增加数字 
HINCRBY key field increment
127.0.0.1:6379> hincrby user age 2	将用户的年龄加2
(integer) 22
127.0.0.1:6379> hget user age		获取用户的年龄
"22“

其它命令
判断字段是否存在
HEXISTS key field
127.0.0.1:6379> hexists user age		查看user中是否有age字段
(integer) 1
127.0.0.1:6379> hexists user name	查看user中是否有name字段
(integer) 0

HSETNX key field value
当字段不存在时赋值,类似HSET,区别在于如果字段已经存在,该命令不执行任何操作。 
127.0.0.1:6379> hsetnx user age 30	如果user中没有age字段则设置age值为30,否则不做任何操作
(integer) 0

只获取字段名或字段值 
HKEYS key
HVALS key
127.0.0.1:6379> hmset user age 20 name lisi 
OK
127.0.0.1:6379> hkeys user
1) "age"
2) "name"
127.0.0.1:6379> hvals user
1) "20"
2) "lisi"

获取字段数量 
HLEN key
127.0.0.1:6379> hlen user
(integer) 2

五.数据类型


1.list

向列表两端增加元素:

LPUSH key value [value ...]
RPUSH key value [value ...]
向列表左边增加元素 
127.0.0.1:6379> lpush list:1 1 2 3
(integer) 3
向列表右边增加元素 
127.0.0.1:6379> rpush list:1 4 5 6
(integer) 3

查看列表:

LRANGE key start stop
LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。 
127.0.0.1:6379> lrange list:1 0 2
1) "2"
2) "1"
3) "4"

从列表两端弹出元素 :

LPOP key
RPOP key
LPOP命令从列表左边弹出一个元素,会分两步完成,第一步是将列表左边的元素从列表中移除,第二步是返回被移除的元素值。 
127.0.0.1:6379> lpop list:1
"3“
127.0.0.1:6379> rpop list:1
"6“

获取列表中元素的个数 :

LLEN key
127.0.0.1:6379> llen list:1
(integer) 2

2.set

增加/删除元素:

SADD key member [member ...]
SREM key member [member ...]
127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0
127.0.0.1:6379> srem set c d
(integer) 1

获得集合中的所有元素:

SMEMBERS key
127.0.0.1:6379> smembers set
1) "b"
2) "a”
判断元素是否在集合中,无论集合中有多少元素都可以极速的返回结果。 
SISMEMBER key member
127.0.0.1:6379> sismember set a
(integer) 1
127.0.0.1:6379> sismember set h
(integer) 0

3.sorted set

增加元素:

向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。 
ZADD key score member [score member ...]
127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu 
(integer) 3
127.0.0.1:6379> zadd scoreboard 97 lisi 
(integer) 0
获取元素的分数 
ZSCORE key member
127.0.0.1:6379> zscore scoreboard lisi 
"97"

删除元素:

ZREM key member [member ...]
移除有序集key中的一个或多个成员,不存在的成员将被忽略。
当key存在但不是有序集类型时,返回一个错误。

127.0.0.1:6379> zrem scoreboard lisi
(integer) 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值