zoukankan      html  css  js  c++  java
  • linux安装redis

    首先需要安装gcc

    yum install gcc-c++

    然后tar -zxvf解压后进入redis目录 执行

    make distclean 
    make

    最后执行

    make install

    '

    至此 redis安装完成

    拷贝一份redis.conf文件 修改其中的参数如下

    设置为yes为可以后台运行

    然后执行

    redis-server ./redis.conf
    redis-cli -p 6379

    进入redis 并测试是否可用

    关闭redis:

    shutdown
    exit

    redis是单线程采用io多路复用技术,初始16个数据库

    可以用来测试服务器性能

    具体方法:

    1、启动redis,进入/usr/local/bin目录 执行

    redis-benchmark

    redis 切换数据库 :

    select 2
    (0-15)一共16个数据库

    hashset 的底层就是hashmap

    dbsize 查询redis数据库有几个KEY

    keys * 查询redis数据库key

    flushdb 清除当前库数据

    flushall 清除所有库数据

    exists key的名字,判断某个key是否存在

    move key db --->当前库就没有了,被移除了 移动key

    expire key 秒钟:为给定的key设置过期时间

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

    type key 查看key的类型 

    getrange key 0 3 获取字符串0到3位

    setrange key 0 3 插入字符串的0到3位

    redis五大数据类型:

    String hash list set zset(sorted set)
    String(字符串)
    string 是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
    string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
    string类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M
    
    Hash(哈希)
    Redis hash是一个键值对集合。
    Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
    类似java里面的Map<String,Object> 
    
    
    List(列表)
    Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)它的底层实际是个链表 
    
    
    
    zset(sorted set:有序集合)
    Redis zset 和set一样也是string类型的元素集合,且不允许重复的成员。
    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score 排序)却可以重复。

     springboot 整合redis

     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
     </dependency>
    server:
      port: 80
    spring:
        redis:
          host: 192.168.209.130 
          port: 6379
          jedis:
            pool:
              max-active: 8
              max-wait: -1
              max-idle: 500
              min-idle: 0
          lettuce:
            shutdown-timeout: 0

    redis 工具类

     
    
    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    
    /**
     * RedisTemplate 工具类
     *
     * @author coderBing
     * @version 2019/04/28
     * @param <V>
     */
    @Component
    public class RedisUtil<V> {
        @Autowired
        private RedisTemplate redisTemplate;
    
        // - - - - - - - - - - - - - - - - - - - - - 公共方法 - - - - - - - - - - - - - - -
        // - - - - -
    
        /**
         * 给一个指定的 key 值附加过期时间
         *
         * @param key
         * @param time
         * @return
         */
        public boolean expire(String key, long time) {
            return redisTemplate.expire(key, time, TimeUnit.SECONDS);
        }
    
        /**
         * 根据key 获取过期时间
         *
         * @param key
         * @return
         */
        public long getTime(String key) {
            return redisTemplate.getExpire(key, TimeUnit.SECONDS);
        }
    
        /**
         * 根据key 获取过期时间
         *
         * @param key
         * @return
         */
        public boolean hasKey(String key) {
            return redisTemplate.hasKey(key);
        }
    
        /**
         * 移除指定key 的过期时间
         *
         * @param key
         * @return
         */
        public boolean persist(String key) {
            return redisTemplate.boundValueOps(key).persist();
        }
    
        // - - - - - - - - - - - - - - - - - - - - - String类型 - - - - - - - - - - - - -
        // - - - - - - -
    
        /**
         * 根据key获取值
         *
         * @param key 键
         * @return 值
         */
        public Object get(String key) {
            return key == null ? null : redisTemplate.opsForValue().get(key);
        }
    
        /**
         * 将值放入缓存
         *
         * @param key   键
         * @param value 值
         * @return true成功 false 失败
         */
        public void set(String key, String value) {
            redisTemplate.opsForValue().set(key, value);
        }
    
        /**
         * 将值放入缓存并设置时间
         *
         * @param key   键
         * @param value 值
         * @param time  时间(秒) -1为无期限
         * @return true成功 false 失败
         */
        public void set(String key, String value, long time) {
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            } else {
                redisTemplate.opsForValue().set(key, value);
            }
        }
    
        /**
         * 批量添加 key (重复的键会覆盖)
         *
         * @param keyAndValue
         */
        public void batchSet(Map<String, String> keyAndValue) {
            redisTemplate.opsForValue().multiSet(keyAndValue);
        }
    
        /**
         * 批量添加 key-value 只有在键不存在时,才添加 map 中只要有一个key存在,则全部不添加
         *
         * @param keyAndValue
         */
        public void batchSetIfAbsent(Map<String, String> keyAndValue) {
            redisTemplate.opsForValue().multiSetIfAbsent(keyAndValue);
        }
    
        /**
         * 对一个 key-value 的值进行加减操作, 如果该 key 不存在 将创建一个key 并赋值该 number 如果 key 存在,但 value
         * 不是长整型 ,将报错
         *
         * @param key
         * @param number
         */
        public Long increment(String key, long number) {
            return redisTemplate.opsForValue().increment(key, number);
        }
    
        /**
         * 对一个 key-value 的值进行加减操作, 如果该 key 不存在 将创建一个key 并赋值该 number 如果 key 存在,但 value 不是
         * 纯数字 ,将报错
         *
         * @param key
         * @param number
         */
        public Double increment(String key, double number) {
            return redisTemplate.opsForValue().increment(key, number);
        }
    
        // - - - - - - - - - - - - - - - - - - - - - set类型 - - - - - - - - - - - - - - -
        // - - - - -
    
        /**
         * 将数据放入set缓存
         *
         * @param key 键
         * @return
         */
        public void sSet(String key, String value) {
            redisTemplate.opsForSet().add(key, value);
        }
    
        /**
         * 获取变量中的值
         *
         * @param key 键
         * @return
         */
        public Set<Object> members(String key) {
            return redisTemplate.opsForSet().members(key);
        }
    
        /**
         * 随机获取变量中指定个数的元素
         *
         * @param key   键
         * @param count 值
         * @return
         */
        public void randomMembers(String key, long count) {
            redisTemplate.opsForSet().randomMembers(key, count);
        }
    
        /**
         * 随机获取变量中的元素
         *
         * @param key 键
         * @return
         */
        public Object randomMember(String key) {
            return redisTemplate.opsForSet().randomMember(key);
        }
    
        /**
         * 弹出变量中的元素
         *
         * @param key 键
         * @return
         */
        public Object pop(String key) {
            return redisTemplate.opsForSet().pop("setValue");
        }
    
        /**
         * 获取变量中值的长度
         *
         * @param key 键
         * @return
         */
        public long size(String key) {
            return redisTemplate.opsForSet().size(key);
        }
    
        /**
         * 根据value从一个set中查询,是否存在
         *
         * @param key   键
         * @param value 值
         * @return true 存在 false不存在
         */
        public boolean sHasKey(String key, Object value) {
            return redisTemplate.opsForSet().isMember(key, value);
        }
    
        /**
         * 检查给定的元素是否在变量中。
         *
         * @param key 键
         * @param obj 元素对象
         * @return
         */
        public boolean isMember(String key, Object obj) {
            return redisTemplate.opsForSet().isMember(key, obj);
        }
    
        /**
         * 转移变量的元素值到目的变量。
         *
         * @param key     键
         * @param value   元素对象
         * @param destKey 元素对象
         * @return
         */
        public boolean move(String key, String value, String destKey) {
            return redisTemplate.opsForSet().move(key, value, destKey);
        }
    
        /**
         * 批量移除set缓存中元素
         *
         * @param key    键
         * @param values 值
         * @return
         */
        public void remove(String key, Object... values) {
            redisTemplate.opsForSet().remove(key, values);
        }
    
        /**
         * 通过给定的key求2个set变量的差值
         *
         * @param key     键
         * @param destKey 键
         * @return
         */
        public Set<Set> difference(String key, String destKey) {
            return redisTemplate.opsForSet().difference(key, destKey);
        }
    
        // - - - - - - - - - - - - - - - - - - - - - hash类型 - - - - - - - - - - - - - -
        // - - - - - -
    
        /**
         * 加入缓存
         *
         * @param key 键
         * @param map 键
         * @return
         */
        public void add(String key, Map<String, String> map) {
            redisTemplate.opsForHash().putAll(key, map);
        }
    
        /**
         * 获取 key 下的 所有 hashkey 和 value
         *
         * @param key 键
         * @return
         */
        public Map<Object, Object> getHashEntries(String key) {
            return redisTemplate.opsForHash().entries(key);
        }
    
        /**
         * 验证指定 key 下 有没有指定的 hashkey
         *
         * @param key
         * @param hashKey
         * @return
         */
        public boolean hashKey(String key, String hashKey) {
            return redisTemplate.opsForHash().hasKey(key, hashKey);
        }
    
        /**
         * 获取指定key的值string
         *
         * @param key  键
         * @param key2 键
         * @return
         */
        public String getMapString(String key, String key2) {
            return redisTemplate.opsForHash().get("map1", "key1").toString();
        }
    
        /**
         * 获取指定的值Int
         *
         * @param key  键
         * @param key2 键
         * @return
         */
        public Integer getMapInt(String key, String key2) {
            return (Integer) redisTemplate.opsForHash().get("map1", "key1");
        }
    
        /**
         * 弹出元素并删除
         *
         * @param key 键
         * @return
         */
        public String popValue(String key) {
            return redisTemplate.opsForSet().pop(key).toString();
        }
    
        /**
         * 删除指定 hash 的 HashKey
         *
         * @param key
         * @param hashKeys
         * @return 删除成功的 数量
         */
        public Long delete(String key, String... hashKeys) {
            return redisTemplate.opsForHash().delete(key, hashKeys);
        }
    
        /**
         * 给指定 hash 的 hashkey 做增减操作
         *
         * @param key
         * @param hashKey
         * @param number
         * @return
         */
        public Long increment(String key, String hashKey, long number) {
            return redisTemplate.opsForHash().increment(key, hashKey, number);
        }
    
        /**
         * 给指定 hash 的 hashkey 做增减操作
         *
         * @param key
         * @param hashKey
         * @param number
         * @return
         */
        public Double increment(String key, String hashKey, Double number) {
            return redisTemplate.opsForHash().increment(key, hashKey, number);
        }
    
        /**
         * 获取 key 下的 所有 hashkey 字段
         *
         * @param key
         * @return
         */
        public Set<Object> hashKeys(String key) {
            return redisTemplate.opsForHash().keys(key);
        }
    
        /**
         * 获取指定 hash 下面的 键值对 数量
         *
         * @param key
         * @return
         */
        public Long hashSize(String key) {
            return redisTemplate.opsForHash().size(key);
        }
    
        // - - - - - - - - - - - - - - - - - - - - - list类型 - - - - - - - - - - - - - -
        // - - - - - -
    
        /**
         * 在变量左边添加元素值
         *
         * @param key
         * @param value
         * @return
         */
        public void leftPush(String key, Object value) {
            redisTemplate.opsForList().leftPush(key, value);
        }
    
        /**
         * 获取集合指定位置的值。
         *
         * @param key
         * @param index
         * @return
         */
        public Object index(String key, long index) {
            return redisTemplate.opsForList().index("list", 1);
        }
    
        /**
         * 获取指定区间的值。
         *
         * @param key
         * @param start
         * @param end
         * @return
         */
        public List<Object> range(String key, long start, long end) {
            return redisTemplate.opsForList().range(key, start, end);
        }
    
        /**
         * 把最后一个参数值放到指定集合的第一个出现中间参数的前面, 如果中间参数值存在的话。
         *
         * @param key
         * @param pivot
         * @param value
         * @return
         */
        public void leftPush(String key, String pivot, String value) {
            redisTemplate.opsForList().leftPush(key, pivot, value);
        }
    
        /**
         * 向左边批量添加参数元素。
         *
         * @param key
         * @param values
         * @return
         */
        public void leftPushAll(String key, String... values) {
    //        redisTemplate.opsForList().leftPushAll(key,"w","x","y");
            redisTemplate.opsForList().leftPushAll(key, values);
        }
    
        /**
         * 向集合最右边添加元素。
         *
         * @param key
         * @param value
         * @return
         */
        public void leftPushAll(String key, String value) {
            redisTemplate.opsForList().rightPush(key, value);
        }
    
        /**
         * 向左边批量添加参数元素。
         *
         * @param key
         * @param values
         * @return
         */
        public void rightPushAll(String key, String... values) {
    //        redisTemplate.opsForList().leftPushAll(key,"w","x","y");
            redisTemplate.opsForList().rightPushAll(key, values);
        }
    
        /**
         * 以集合方式向右边添加元素。
         *
         * @param key
         * @param values
         * @return
         */
        public void rightPushAll(String key, Collection<V> values) {
            redisTemplate.opsForList().rightPushAll(key, values);
        }
    
        /**
         * 向已存在的集合中添加元素。
         *
         * @param key
         * @param value
         * @return
         */
        public void rightPushIfPresent(String key, Object value) {
            redisTemplate.opsForList().rightPushIfPresent(key, value);
        }
    
        /**
         * 向已存在的集合中添加元素。
         *
         * @param key
         * @return
         */
        public long listLength(String key) {
            return redisTemplate.opsForList().size(key);
        }
    
        /**
         * 移除集合中的左边第一个元素。
         *
         * @param key
         * @return
         */
        public void leftPop(String key) {
            redisTemplate.opsForList().leftPop(key);
        }
    
        /**
         * 移除集合中左边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
         *
         * @param key
         * @return
         */
        public void leftPop(String key, long timeout, TimeUnit unit) {
            redisTemplate.opsForList().leftPop(key, timeout, unit);
        }
    
        /**
         * 移除集合中右边的元素。
         *
         * @param key
         * @return
         */
        public void rightPop(String key) {
            redisTemplate.opsForList().rightPop(key);
        }
    
        /**
         * 移除集合中右边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
         *
         * @param key
         * @return
         */
        public void rightPop(String key, long timeout, TimeUnit unit) {
            redisTemplate.opsForList().rightPop(key, timeout, unit);
        }
    
    }

    redisconfig

    @Configuration
    
    public class RedisConfig {
    
        @Bean
    
        @SuppressWarnings("all")
    
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    
            RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
    
            template.setConnectionFactory(factory);
    
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    
            ObjectMapper om = new ObjectMapper();
    
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    
            jackson2JsonRedisSerializer.setObjectMapper(om);
    
            StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    
            // key采用String的序列化方式
    
            template.setKeySerializer(stringRedisSerializer);
    
            // hash的key也采用String的序列化方式
    
            template.setHashKeySerializer(stringRedisSerializer);
    
            // value序列化方式采用jackson
    
            template.setValueSerializer(jackson2JsonRedisSerializer);
    
            // hash的value序列化方式采用jackson
    
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
    
            template.afterPropertiesSet();
    
            return template;
    
        }
    
    }

    controller

    package com.fwz.redis.controller;
    
    import java.util.Date;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.web.bind.annotation.DeleteMapping;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.fwz.redis.cbean.RedisUtil;
    import com.fwz.redis.cbean.Student;
    
    @RestController
    @RequestMapping("/student")
    public class StudentController {
        @Autowired
        private RedisTemplate redisTemplate;
        @Autowired
        private RedisUtil redisUtil;
    
        @RequestMapping("/a")
        public String set(Student student) {
            student.setBirthday(new Date());
            redisTemplate.opsForValue().set("student", student);
            return "ok";
        }
    
        @GetMapping("/{key}")
        public Student get(@PathVariable String key) {
            return (Student) redisTemplate.opsForValue().get(key);
        }
    
        @DeleteMapping("/{key}")
        public boolean delete(@PathVariable String key) {
            Boolean res = redisTemplate.delete(key);
            return !redisTemplate.hasKey(key);
        }
    }
  • 相关阅读:
    算法竞赛入门经典习题2-3 韩信点兵
    ios入门之c语言篇——基本函数——5——素数判断
    ios入门之c语言篇——基本函数——4——数值交换函数
    144. Binary Tree Preorder Traversal
    143. Reorder List
    142. Linked List Cycle II
    139. Word Break
    138. Copy List with Random Pointer
    137. Single Number II
    135. Candy
  • 原文地址:https://www.cnblogs.com/fengwenzhee/p/14264757.html
Copyright © 2011-2022 走看看